找出straße的字符编码

时间:2013-03-25 17:17:33

标签: utf-8 character-encoding typo3 iso-8859-1 latin1

我正在努力解决外部接口内容的编码问题。在MySQL数据库中,排序规则为latin1_swedish_ci。该字段的整理也是latin1_swedish_ci。 php脚本以UTF-8编码,浏览器中的输出为UTF-8。除了这个数据库的内容外,一切正常。数据库连接应为UTF-8(Typo3 4.7),内容为

  

straße

但它应该是straße

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

  

STRA的ΔE

如果我使用utf8_encode(),我会

  

straße

我的假设是UTF-8编码数据存储在ISO-8859-1中,但如果是这种情况,则不应在此处产生此类问题。我如何找出真正的编码是什么?

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

我最初问题的解决方案:

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

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

3 个答案:

答案 0 :(得分:3)

根据链接网站,字符ß 'LATIN SMALL LETTER SHARP S' (U+00DF)以字节0xC30x9F的UTF-8形式存在:

  

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

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

因此,它最有可能是CP1252编码。

答案 1 :(得分:2)

你所看到的“ß”实际上是windows-1252(也称为CP1252)对构成“ß”的UTF-8编码的两个字节0xC3和0x9F的解释。但这似乎意味着数据实际上是UTF-8编码的,只是被误解为windows-1252编码。所以我认为它应该简单地处理为UTF-8,并采取适当的预防措施。

答案 2 :(得分:1)

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

FROM 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>";

INSIDE PHPMYADMIN

  1. 打开数据库information_schema
  2. 打开表schemata
  3. 查看您的mysql默认排序规则
  4. 您可能会也可能无法更改这些参数,具体取决于用户权限。

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

    $flagChange = mysql_set_charset('utf8', $connection);