2017-02-21 71 views
1

我搜索了一段時間,還沒有找到適合我的東西。我正在使用PHP表單使用SAP DI API將數據提交到SAP。我需要弄清楚哪個字符集實際上允許我存儲和使用越南文字符。正確的字符集在PHP中使用越南字符(這不是Unicode)

UTF8似乎適用於很多角色,但是ô變成了'。更重要的是,有字符限制,UTF-8打破字符限制。如果我有30個字符的字符串,它告訴API它超過了50個。在MySQL中存儲也是如此 - 如果存在varchar字符限制,UTF-8會導致字符串超過它。

不幸的是,當我搜索時,UTF-8似乎是人們對越南人物的唯一建議。如果我根本不編碼字符,它們會被存儲爲它們的html字符代碼。我也試過ISO-8859-1,轉換成UCS-2或UCS-4 ......我真的很茫然。如果任何人有與越南人物合作的經驗,你的幫助將不勝感激。

UPDATE

它出現的問題可能與我在Windows wampserver。這裏的代碼位是困惑我:

$str = 'VậTCôNG'; 
$str1 = utf8_encode($str); 
if (mb_detect_encoding($str,"UTF-8",true) == true) { 
    print_r('yes'); 
    if ($str1 == $str) { 
     print_r('yes2'); 
    } 
} 
echo $str . $str1; 

這版畫「是」,而不是「YES2」,和$ str.str1 =「VậTCôNGVáºTCÃ'NG」在瀏覽器中。

我有我的php.ini文件:

default_charset = "utf-8" 

,並與我的httpd.conf文件:

AddDefaultCharset UTF-8 

和我的PHP文件我跑有:

header("Content-type: text/html; charset=utf-8"); 

所以我現在想知道:如果原始字符串是utf-8,爲什麼它不等於它自己的utf8編碼?爲什麼utf8編碼返回錯誤的字符? wampserver配置有問題嗎?

+1

UTF-8是你想要走到最後的路,沒有什麼嚴肅的選擇。而UTF-8字符集肯定包含越南文字符,他們得到「改變」的事實必須是您的設置的一些本地問題。但是,您必須瞭解UTF-8編碼的實際工作原理才能理解字符串長度的變化。 – arkascha

+0

@arkascha感謝您的回覆。我對UTF-8的問題是,如果我對SAP DI API有50個字符的硬字符限制,並且字符串是32並且有多個越南字符,它將超出限制而不進入。這看起來像是一個破壞者,即使我確實修復了字符集問題。 – Wan

+0

@arkascha忘記了這個迴應。我想你是正確的。我更新了我的帖子,你有什麼見解,爲什麼會發生這種情況?或者我的設置可能會出現什麼地方問題? – Wan

回答

0

ôô的「Mojibake」。也就是說,你的做的有UTF-8,但是代碼中的某些東西使它變得糟糕。

請參閱Trouble with utf8 characters; what I see is not what I stored並搜索Mojibake。它說檢查這些:

  • 要存儲的字節需要UTF-8編碼。解決這個問題。
  • 當INSERT和SELECTING文本需要指定utf8或utf8mb4時的連接。解決這個問題。
  • 該列需要聲明CHARACTER SET utf8(或utf8mb4)。解決這個問題。
  • HTML應以<meta charset=UTF-8>開頭。

可以恢復數據庫中的數據,但它取決於尚未提供的細節。

http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases

每個越南字符採取用於編碼2-3 字節在UTF-8。目前還不清楚「hard 50」是否真的是字符限制或字節限制。

如果你碰巧有變爲亂碼的兄弟姐妹「雙重編碼」,那麼越南的字符將需要4-6 字節,感覺就像2-3 字符。請參閱第一個鏈接中的「測試數據」。

如何在MySQL '撤消' Mobibake一個例子: CONVERT(BINARY(CONVERT('VậTCôNG' USING latin1)) USING utf8mb4) - >'VậTCôNG'

「雙編碼」 是有點像變爲亂碼兩次。一方認爲它是latin1,另一方面是UTF-8,但是兩次。

VậTCôNG,作爲UTF-8,是十六進制56e1baad5443c3b44e47。如果該十六進制被視爲字符集cp850keybcs2,則字符串爲Vß║¡TC├┤NG

+0

嗨@瑞克詹姆斯,我更新了我的帖子以傳達我目前的情況。 mojibake和double編碼一樣嗎?不幸的是,我沒有使用數據庫中的數據(現在只是直接在PHP中給它一個字符串),所以我不知道如何測試。如果SAP DI API將我的角色轉換爲mojibake,這是否意味着它正在編碼本身?看起來,由API導入字符與在它們上運行utf8_encode具有相同的效果,即它們都返回VáºTCÃ'NG。你有什麼想法在這種情況下做什麼? – Wan

+0

雙編碼有點Mojibake兩次。我添加到我的答案。對不起,我不知道如何純粹用PHP來處理它。我花了很長時間才弄清楚MySQL和其他4種錯誤情況。 –