mysql 在PHP中使用越南语字符(不是Unicode)的正确字符集[重复]

sczxawaw  于 2023-08-02  发布在  Mysql
关注(0)|答案(2)|浏览(237)

此问题在此处已有答案

UTF-8 all the way through(13个答案)
去年关闭。
我已经找了一段时间了,还没有找到适合我的东西。我正在使用一个PHP表单,通过API将数据提交到SAP中。我需要弄清楚哪个字符集实际上允许我存储和处理越南字符。
UTF8似乎适用于很多字符,但ô变成了ô。更重要的是,有字符限制,UTF-8打破了字符限制。如果我有一个30个字符的字符串,它告诉API它超过50个。在MySQL中存储也是如此--如果有varchar字符限制,UTF-8会导致字符串超过它。
不幸的是,当我搜索时,UTF-8似乎是人们对越南字符唯一的建议。如果我不编码的字符在所有,他们得到存储为他们的html字符代码。我也试过ISO-8859-1,转换成UCS-2或UCS-4。我真的很迷茫。如果任何人有经验的工作与越南字符,您的帮助将不胜感激。

更新

看来问题可能与我的wampserver在Windows上。这里有一段代码让我很困惑:

$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;

字符串
这将在浏览器中打印“yes”但不打印“yes 2”,并且$str.str1 =“V TCCONGVá º 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配置有问题吗?

eaf3rand

eaf3rand1#

ôô的“Mojibake”。也就是说,你确实有UTF-8,但代码中的某些东西破坏了它。
查看Trouble with utf8 characters; what I see is not what I stored并搜索Mojibake。上面说要检查这些:

  • 要存储的字节需要进行UTF-8编码。解决这件事
  • INSERT和SELECTing文本时的连接需要指定utf8或utf8 mb 4。解决这件事
  • 该列需要声明为CHARACTER SET utf8(或utf8 mb 4)。解决这件事
  • HTML应该以<meta charset=UTF-8>开头。

可以恢复数据库中的数据,但这取决于尚未提供的详细信息。
http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases
每个越南语 * 字符 * 需要2-3 * 字节 * 用于UTF-8编码。目前还不清楚“硬50”是否真的是一个 * 字符 * 限制或 * 字节 * 限制。
如果你碰巧有Mojibake的兄弟“双重编码”,那么一个越南字符将占用4-6 * 字节 *,感觉像2-3 * 字符 *。请参阅第一个链接中的“测试数据”。
如何在MySQL中“撤消”Mobibake的示例:CONVERT(BINARY(CONVERT('VậTCôNG' USING latin1)) USING utf8mb4) --> 'VậTCôNG'
“双重编码”有点像两次Mojibake。也就是说,一方将其视为latin 1,另一方将其视为UTF-8,但两次。
VậTCôNG,作为UTF-8,是十六进制56e1baad5443c3b44e47。如果该十六进制被视为字符集cp850keybcs2,则字符串为Vß║¡TC├┤NG

az31mfrm

az31mfrm2#

将其更改为VISCII。

Input: ô 
Output: ô

字符串
你可以在Charset converter上测试它。

相关问题