php - 在 PHP 中使用越南字符(不是 Unicode)的正确字符集

标签 php mysql utf-8 character-encoding sap

<分区>

我已经四处搜索了一段时间,但还没有找到适合我的东西。我正在使用 PHP 表单通过 SAP DI API 将数据提交到 SAP。我需要弄清楚哪个字符集实际上允许我存储和使用越南字符。

UTF8 似乎适用于很多字符,但 ô 变成了 ô。更重要的是,有字符限制,UTF-8 打破了字符限制。如果我有一个 30 个字符的字符串,它会告诉 API 它超过 50 个。存储在 MySQL 中也是如此——如果有 varchar 字符限制,UTF-8 会导致字符串超过它。

不幸的是,当我搜索时,UTF-8 似乎是人们唯一建议的越南字符。如果我根本不对字符进行编码,它们将存储为 html 字符代码。我也尝试过ISO-8859-1,转换成UCS-2或UCS-4......我真的很茫然。如果有人有使用越南字符的经验,将不胜感激您的帮助。

更新

看来问题可能出在我的 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;

这会在浏览器中打印“yes”而不是“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 配置有问题吗?

最佳答案

ôô 的“Mojibake” .也就是说,您确实有 UTF-8,但代码中的某些东西破坏了它。

参见 Trouble with utf8 characters; what I see is not what I stored并搜索 Mojibake。它说要检查这些:

  • 要存储的字节需要采用 UTF-8 编码。解决这个问题。
  • INSERTing和SELECTing text时的连接需要指定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”是否真的是字符 限制或字节 限制。

如果您碰巧有 Mojibake 的兄弟“双重编码”,那么一个越南字符将占用 4-6 个字节,感觉就像 2-3 个字符。请参阅第一个链接中的“测试数据”。

如何在 MySQL 中“撤消”Mobibake 的示例: CONVERT(BINARY(CONVERT('VậTCôNG' USING latin1)) USING utf8mb4) --> 'VậTCôNG'

“双重编码”有点像两次 Mojibake。即一侧将其视为 latin1,另一侧将其视为 UTF-8,但两次。

VậTCôNG ,作为 UTF-8,是十六进制 56e1baad5443c3b44e47 .如果该十六进制被视为字符集 cp850keybcs2 , 字符串是 Vß║¡TC├┤NG .

关于php - 在 PHP 中使用越南字符(不是 Unicode)的正确字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42376325/

相关文章:

mysql - SQL查询选择语句

php - MySQL数据CHARSET问题,请看图!

php - Android JSON 与 Volley 和 PHP 输入结束于字符 0

php - Magento 是否支持多线程?

php - 基于两列的排名

mysql - 使用第三个表的条件从另一个表插入到一个表中

php - FIND_IN_SET 有两个字符串

php - Doctrine2 多对一关联不会使用 JOIN 查询

ios - 将 JSON 中的 UTF8 字符串转换为纯文本 iOS?

javascript - 用 pako(javascript 中的 zlib)压缩,用 zlib(python)解压不起作用