2014-09-30 35 views
1

過去幾天我一直在閱讀關於UTF-8和unicode的內容,當我想到我想到了這一切時,當我讀到UTF-8和ISO 8859- 9不兼容。UTF-8和ISO 8859-9

我有一個數據庫存儲數據爲UTF-8。我有一個客戶的要求來支持各種ISO 8859-x代碼頁(即8859-3,8859-2和ISO 6937)。我的問題是:

  1. 由於我的數據攝取和數據庫引擎類型是UTF-8,假設我使用unicode是否正確?

  2. 據我所知,unicode可以支持所有的字符,它是要走的路。但是,我的客戶是一個希望我們使用ISO代碼頁的歐洲實體。所以我的問題是如何使用現有的UTF-8數據支持多個客戶端用例?由於ISO 8859-x不是unicode的子集,我必須編寫代碼來根據我的使用情況發送適當的ISO 8859-x字符集嗎?是我需要做還是還有更多?

順便說一句,我的理解是,UTF-8只是一種編碼算法,從二進制數據中獲取數值。如果是這樣,字符集是如何應用的?我是否必須編寫一個返回8859-x響應的代碼,或者只需要在響應頭中設置適當的字符集值?

+0

這正是你應該使用Unicode的情況下,當有你需要支持多個代碼頁! Unicode可以同時包含*全部*。您的數據庫應該能夠在必要時進行轉換,或者您可以在代碼中進行轉換。 – 2014-09-30 11:32:09

回答

4

主題非常廣闊,讓我簡化(很多,甚至太多)並逐點回答。

由於我的數據攝取和數據庫引擎類型是UTF-8,假設我使用unicode是否正確?

是的,你正在使用UNICODE和你存儲UNICODE字符使用UTF-8編碼(正式名稱代碼點)。請注意,UNICODE定義了規則和字符集(即使同一個單詞經常用作UTF-16編碼的同義詞),您在字節流中編碼這些字符的方式也是另一回事。

...但是,我的客戶是一個希望我們使用ISO代碼頁的歐洲實體。所以我的問題是如何使用現有的UTF-8數據支持多個客戶端用例?

當然,如果你存儲UNICODE字符(沒關係與編碼),那麼你可以隨時將它們轉換爲特定的ASCII代碼頁(或任何其他的編碼)。好吧,這並不是正式的(因爲UNICODE沒有定義過去使用/使用的每個可能的字符),但我會忽略這一點...

...自ISO 8859-x不是unicode的一個子集,我必須編寫代碼來根據我的用例發送相應的ISO 8859-x字符集嗎?

從ISO 8859代碼頁所有字符也是UNICODE可用,那麼(從這個角度來看),這是一個子集。當然編碼值是不同的,所以他們需要轉換。如果您知道每個客戶需要的代碼頁,那麼您始終可以將UNICODE UTF-8編碼文本轉換爲ASCII(具有正確的代碼頁)文本。

是我需要做還是有更多的呢?

就是這樣。代碼可能很短,但你沒有用任何語言標記你的問題,所以我不會提供鏈接/例子。只是一個簡單的例子,看看this post

讓我也說一件重要的事情:如果他們想要使用他們的代碼頁使用ASCII碼的數據,那麼你必須執行轉換。如果他們可以直接使用UTF-8數據(或者以您自己的應用程序以某種方式呈現它們),那麼您不必擔心代碼頁(這就是我們使用UNICODE的原因),因爲 - 無需編碼 - UNICODE字符集包含所有可能需要的角色。

順便說一句,我的理解是,UTF-8僅僅是一種從二進制數據中獲取數值的編碼算法。

不完全是。你有一張人物表,對吧?例如A。現在你必須存儲一個數值,它將被解釋爲A。在ASCII中,他們任意決定65是表示該字符的數字值。 UNICODE是一個長長的字符列表(以及將它們組合在一起的規則),UTF-X是用來將它們存儲爲數字值的任意表示形式。

如果是這樣,字符集是如何應用的?

「字符集」是一個非常含糊的句子。用UNICODE字符集您的意思是UNICODE提供的所有字符。如果您的意思是代碼頁那麼(簡化)它代表可用字符集的子集。假設你有8位ASCII碼(最多256個符號),你無法容納在歐洲使用的所有字符,對吧?代碼頁解決了這個問題,這些符號中的一半總是相同的,而另一半代表根據代碼頁代表不同的字符(每個「國家」將使用具有其首選字符的特定代碼頁)。

有關此主題的介紹概述:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets