我用utf8編碼是一個小問題。 我試圖編碼的詞是「kühl」。 所以它有一個特殊的字符。不同的utf8編碼?
當我在第一個文件在此字符串UTF8編碼,我得到:
kühl
當我在第二個文件在此字符串UTF8編碼,我得到:
kuÌhl
使用php utf8_encode()我總是得到第一個(kühl)作爲輸出,但我需要第二個作爲輸出(kuÌ hl)。
mb_detect_encoding告訴我它是「UTF-8」,所以這並沒有什麼幫助。
你有什麼想法得到第二個作爲輸出? 在此先感謝!
我用utf8編碼是一個小問題。 我試圖編碼的詞是「kühl」。 所以它有一個特殊的字符。不同的utf8編碼?
當我在第一個文件在此字符串UTF8編碼,我得到:
kühl
當我在第二個文件在此字符串UTF8編碼,我得到:
kuÌhl
使用php utf8_encode()我總是得到第一個(kühl)作爲輸出,但我需要第二個作爲輸出(kuÌ hl)。
mb_detect_encoding告訴我它是「UTF-8」,所以這並沒有什麼幫助。
你有什麼想法得到第二個作爲輸出? 在此先感謝!
只有一種編碼稱爲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和複製/粘貼表示,就好像它是實際的現實文本是反覆無常最好。如果您有字符編碼問題,則實際字節(例如,十六進制)是唯一可以用來表達您所擁有的便於理解的方式。在許多情況下,計算機如何呈現它是不可預知的,特別是當編碼有問題或未知時。我一直堅持你在你的問題中使用的演示文稿,但如果你有其他問題,請注意清楚地說明問題。
我希望贊成將UTF-8添加到'iconv'並告訴它將Latin-1轉換爲UTF-8以便在我的UTF-8終端中查看「Latin-1」表示形式的back-asswards方法。 – tripleee 2013-04-10 15:34:35
非常感謝! – user2266317 2013-04-10 18:21:56
如果我錯了,請糾正我,但這是NFC vs NFD問題嗎?雖然這個回答非常具有描述性,但它並沒有真正回答OP詢問的問題,即如何在NFD中獲得它。 – Phil 2015-05-11 11:11:19
utf8_encode,儘管它的名稱,不奇蹟般地編碼爲UTF-8。
只有你的源代碼是ISO-8559-1,也就是latin-1,它才能工作。
如果您的源已經是UTF-8或任何其他編碼,它將輸出損壞的數據。
當我在記事本++中檢查kühl並選擇UTF-8時,它確定。第二個似乎很奇怪。 – Kaffee 2013-04-10 13:52:01
有什麼想法第二個可能是什麼?我不明白爲什麼mb_detect_encoding告訴我它也是UTF-8 – user2266317 2013-04-10 13:57:32
我假設你的腳本文件是使用不同的字符編碼保存的 - 所以你的實際上並不是UTF8編碼,而是在這兩種情況下編碼相同的字節序列,但是不同的編碼。 – CBroe 2013-04-10 14:16:19