2013-04-10 116 views
0

我用utf8編碼是一個小問題。 我試圖編碼的詞是「kühl」。 所以它有一個特殊的字符。不同的utf8編碼?

當我在第一個文件在此字符串UTF8編碼,我得到:

kühl

當我在第二個文件在此字符串UTF8編碼,我得到:

kuÌhl

使用php utf8_encode()我總是得到第一個(kühl)作爲輸出,但我需要第二個作爲輸出(kuÌ hl)。

mb_detect_encoding告訴我它是「UTF-8」,所以這並沒有什麼幫助。

你有什麼想法得到第二個作爲輸出? 在此先感謝!

+0

當我在記事本++中檢查kühl並選擇UTF-8時,它確定。第二個似乎很奇怪。 – Kaffee 2013-04-10 13:52:01

+0

有什麼想法第二個可能是什麼?我不明白爲什麼mb_detect_encoding告訴我它也是UTF-8 – user2266317 2013-04-10 13:57:32

+0

我假設你的腳本文件是使用不同的字符編碼保存的 - 所以你的實際上並不是UTF8編碼,而是在這兩種情況下編碼相同的字節序列,但是不同的編碼。 – CBroe 2013-04-10 14:16:19

回答

4

只有一種編碼稱爲UTF-8,但有多種方式可以用Unicode表示一些字形。 U+00FC是拉丁語-1兼容性的單字形預分解ü,其在拉丁語-1中顯示爲kühl,而關閉我的頭頂部kuÌ hl看起來像是相同字符的完全分解的表達,即U+0075(u),隨後是U+0308(結合diaeresis)。另請參見http://en.wikipedia.org/wiki/Unicode_equivalence#Normalization

vbvntv$ perl -CSD -le 'print "ku\x{0308}hl"' | iconv -f latin1 -t utf8 
ku�hl 
vbvntv$ perl -CSD -le 'print "ku\x{0308}hl"' | xxd 
0000000: 6b75 cc88 686c 0a     ku..hl. 

均爲0x88不是有效的字符的Latin-1左右(在我的瀏覽器),它會顯示爲「無效字符」佔位符(黑鑽石在它白色的問號),而其他人可能會看到還有其他的東西,或者什麼也沒有。

顯然,你可以使用class.normalize在PHP中這兩種形式之間的轉換:

$normalized = Normalizer::normalize($input, Normalizer::FORM_D); 

順便提一下,觀看UTF8拉丁-1和複製/粘貼表示,就好像它是實際的現實文本是反覆無常最好。如果您有字符編碼問題,則實際字節(例如,十六進制)是唯一可以用來表達您所擁有的便於理解的方式。在許多情況下,計算機如何呈現它是不可預知的,特別是當編碼有問題或未知時。我一直堅持你在你的問題中使用的演示文稿,但如果你有其他問題,請注意清楚地說明問題。

+1

我希望贊成將UTF-8添加到'iconv'並告訴它將Latin-1轉換爲UTF-8以便在我的UTF-8終端中查看「Latin-1」表示形式的back-asswards方法。 – tripleee 2013-04-10 15:34:35

+0

非常感謝! – user2266317 2013-04-10 18:21:56

+0

如果我錯了,請糾正我,但這是NFC vs NFD問題嗎?雖然這個回答非常具有描述性,但它並沒有真正回答OP詢問的問題,即如何在NFD中獲得它。 – Phil 2015-05-11 11:11:19

0

utf8_encode,儘管它的名稱,不奇蹟般地編碼爲UTF-8。

只有你的源代碼是ISO-8559-1,也就是latin-1,它才能工作。

如果您的源已經是UTF-8或任何其他編碼,它將輸出損壞的數據。