0

我需要緊急幫助。我無法比較charset字符串。寫入數據庫table1的字符串是utf-8 charset,但看起來仍然很奇怪:SADI 但是,寫入到同一個數據庫中的table2的字符串是SADI,這是正常的。每當我比較兩者時,它會給出錯誤。字符集比較

  1. 任何想法如何進行比較? (實際上比較應該會給出真實結果)

  2. 任何想法如何將SADI作爲SADI插入數據庫。

要麼希望是一個解決方案。

+0

這是一個很好的問題,但不是字符集。它是關於比較Ascii字符串和全角字符串。 –

回答

2

在你的字符串中,SADI是標準的ASCII字符串,但SADI使用的是全角Unicode字符。

例如,U+FF33 'FULLWIDTH LATIN CAPITAL LETTER S'(UTF-8:0xEF 0xBC 0xB3

S是標準的ASCII U+0053 'LATIN CAPITAL LETTER S'(UTF-8 0x53)。

其他字符也是類似的擴展Unicode字符,看起來像標準的拉丁腳本,但實際上並不是。

他們是如何到達那裏的 - 這是一個很好的問題。可能有人有真正的創意,並從Word複製粘貼的東西?誰知道。

您可以通過使用該Perl腳本作爲過濾器應用的Unicode NFKC(Unicode Normalization Form KC)這些奇怪的字符轉換回正常者(它接受UTF-8和輸出標準化的UTF-8):

use Unicode::Normalize; 
binmode STDIN, ':utf8'; 
binmode STDOUT, ':utf8'; 
while(<>) { print NFKC($_); } 

在PHP中:

$result = Normalizer::normalize($str, Normalizer::FORM_KC); 

需要intl extension

+0

一個很好的分析和一個很好的解決方案,但根據整體數據,轉換到NFKC也可能會丟棄許多其他區別,而不僅僅是Ascii字母和其全角對應字符之間的區別。例如,微符號μ與希臘小寫字母μμ之間的區別,或省略號字符「...」與三個時段「...」之間的區別。 –

+0

東亞的某人輸入了該字符串。這些字形的存在是爲了保持西方和亞洲字母的字母一致。 –

+0

我仍然無法處理這個問題。儘管在WAMP服務器中啓用,但intl擴展似乎無法正常工作。我用其他方法: – xnote