3

我正在为外部接口内容的编码而苦苦挣扎。在 MySQL 数据库中,排序规则是latin1_swedish_ci. 也是字段 ist 的整理latin1_swedish_ci。php 脚本以 UTF-8 编码,浏览器中的输出为我提供 UTF-8。除此数据库的内容外,一切正常。数据库连接应为 UTF-8 (Typo3 4.7),内容为

大街

但它应该是straße

mb_detect_encoding($data['street'],'UTF-8')说是UTF-8。如果我使用utf8_decode()我得到

大街

如果我使用utf8_encode()我得到

斯特拉埃

我的假设是 UTF-8 编码的数据存储在 中ISO-8859-1,但如果是这种情况,这里就不应该出现这样的问题。如何找出真正的编码是什么?

PS:我无法更改源的编码!

我对最初问题的解决方案:

我必须使用这行代码将数据库连接从 UTF-8 设置为 ISO-8859-1

$res = $GLOBALS['TYPO3_DB']->sql_query("SET NAMES latin1");
4

3 回答 3

3

字符ß 'LATIN SMALL LETTER SHARP S' (U+00DF)存在于 UTF-8 字节中0xC3,并且0x9F根据链接的站点:

UTF-8 (十六进制) 0xC3 0x9F (c39f)

如果我们查看ISO-8859-1 代码页布局,那么这些字节代表字符Ã和 ISO-8859-1 代码页布局中未定义的字符。因此不是这样。与 ISO-8859-1 有一些重叠的另一种常见字符编码是 Windows CP1252(也称为 ANSI,在记事本中保存文本文件时默认使用 - 可以通过使用另存为来覆盖)。如果我们查看CP1252 代码页布局,那么这些字节代表字符ß并确认您最初检索的内容。

所以,它很可能是 CP1252 编码的。

于 2013-03-25T17:55:51.807 回答
2

What you see as “ß” is really the windows-1252 (also known as CP1252) interpretation of the two bytes 0xC3 and 0x9F that constitute the UTF-8 encoding of “ß”. But this seems to mean that the data is actually UTF-8 encoded and just gets misinterpreted as windows-1252 encoded. So I think it should be simply processed as UTF-8, with due precautions.

于 2013-03-25T18:01:06.403 回答
1

我建议您继续验证您的 sql 连接正在使用什么字符集。它不一定与您为数据库定义的字符集相同。

来自 PHP

// Opens a connection to a MySQL server
$connection = mysql_connect ($server, $username, $password);
$charset = mysql_client_encoding($connection);
$flagChange = mysql_set_charset('utf8', $connection);
echo "The character set is: $charset</br>mysql_set_charset result:$flagChange</br>";

PHPMYADMIN 内部

  1. 开放数据库information_schema
  2. 打开表schemata
  3. 查看您的mysql默认排序规则

您可能会也可能不会更改这些参数,具体取决于用户权限。

如上所示,我通过将以下行附加到我的connection.php文件(我在使用 db 访问的每个页面的开头调用它)解决了我在 mysql 中的冲突字符集问题:

$flagChange = mysql_set_charset('utf8', $connection);
于 2013-12-04T20:48:28.860 回答