UTF-8、PHP和XMLMySQL
我在解决这个问题时遇到了很大的问题: 我有一个mysql数据库,编码拉丁语和瑞典语,还有一个存储名称和地址的表 我试图输出UTF-8 XML文件,但以下字符串有问题:UTF-8、PHP和XMLMySQL,php,mysql,encoding,utf-8,Php,Mysql,Encoding,Utf 8,我在解决这个问题时遇到了很大的问题: 我有一个mysql数据库,编码拉丁语和瑞典语,还有一个存储名称和地址的表 我试图输出UTF-8 XML文件,但以下字符串有问题: Otivägen当我对文件进行vim时,它将作为OtivÃgen输出。当我打开它的时候,我得到了 “在文本内容中发现无效字符。处理资源时出错” 我有以下代码: function fixEncoding($in_str) { $cur_encoding = mb_detect_encoding($in_str) ;
Otivägen
当我对文件进行vim时,它将作为OtivÃgen
输出。当我打开它的时候,我得到了
“在文本内容中发现无效字符。处理资源时出错
”
我有以下代码:
function fixEncoding($in_str)
{
$cur_encoding = mb_detect_encoding($in_str) ;
if($cur_encoding == "UTF-8" && mb_check_encoding($in_str,"UTF-8"))
return $in_str;
else
return utf8_encode($in_str);
}
header("Content-type: text/plain;charset=utf-8");
$mystring = "Otivägen" // this is actually obtained from database;
$myxml = "<myxml>
....
<node>".$mystring."</node>
....
</myxml>
";
$myxml = fixEncoding($myxml);
提前谢谢 您的MySQL连接编码是否正确设置为
UTF-8
查看和以了解更多详细信息。
latin1\u swedish\u ci
是一种排序规则,而不是字符集。由于排序规则应该与它们的字符集相匹配,这表明该表使用的是latin1,但这不是保证
严格来说,表的字符集在这里是不相关的,因为MySql可以转换输入/输出。这就是连接字符集(mysql\u set\u charset
)的用途。但是,要使其正常工作,需要在数据库中对数据进行正确编码。我首先检查数据库中的字符串是否正确。最简单的方法是登录命令行并选择一个包含非ascii字符的行。看起来还好吗
$mystring = "Otivägen" // this is actually obtained from database;
小心。
$mystring
中的数据编码现在将取决于php文件的编码。这可能与数据库中的数据相同,也可能不同。在输出前运行查询设置名称utf8
输出后,您可以返回并运行设置名称1
看,我也遇到了同样的问题似乎您是“双重编码”Otivägen。如果Otivägen已经是UTF-8,您就会出现这种行为,然后再次对其运行utf8äU encode()。例如:
$str = "Otivägen"; // already an UTF-8 string
echo utf8_encode($str); // outputs Otivägen
我不确定是否确实发生了“双重编码”,但这可能是由于编辑器中的设置。我的理论。假设您正在运行Aptana Studio:您的实际字符集设置为ISO-8859-1(在Aptana中,您可以通过右键单击文件并选择“属性”来检查此设置。要为所有项目设置默认字符编码,请从Aptana主菜单->常规->工作区中选择首选项)。如果是这种情况,则实际的PHP源文件(其中包含$myxml
及其字符串..
)被检测为ISO-8859-1,但从数据库接收到的$mystring是UTF-8。然后,您的fixEncoding函数将运行else子句,因为$myxml作为一个整体被视为ISO-8859-1,而不是UTF-8。这会导致对数据库中的结果进行双重编码,这可能是导致问题的原因
在编辑器中检查实际源文件的编码,并验证它是否设置为UTF-8。或者,尝试将fixEncoding/utf8_encode/utf8_decode应用或删除到$myxml。观察结果,看看需要对值Otivägen right做些什么。我认为您做的一切都是正确的,只是您的终端是拉丁语-1
ä的UTF-8序列是C3 A4,如果显示为拉丁语-1,则为Ã。UTF8问题可能是一个真正的难题,当某些东西为您重新编码时,它们几乎不可能解决 您确实需要从一端开始,并确保每个进程都是UTF8。这将消除过程中错误解释数据和为您“转换”数据的情况。但值得注意的是,它还可以让您更容易地发现某些内容已经对您的文本进行了错误编码(是的,我遇到了这个问题) 如果表中的UTF8数据未设置为UTF8,并且可能被错误编码,则需要在数据重新编码后,最后执行这些表。否则,您将无法挽回地损坏数据。我也有这个问题 第一步:
- 检查您的终端是否符合UTF8标准。Gnome终端是。Kterm是。永恒不是
- 检查shell中的LANG设置。它的值末尾应该有.UTF-8
- 检查vim是否正确拾取UTF8设置。您可以使用
:设置编码
显示诸如“character_set%”之类的变量代码>。结果可能是:
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
您的目标是将所有那些latin1
值(或您看到的任何值)更改为utf8
设置名称utf8
将更改其中的大多数,您可能需要在数据库中的每个新连接中都这样做。这是我在以前的申请中必须采用的解决方案。要更改的其他设置位于my.cnf文件中,我需要指示您访问该文件。您不太可能需要全部设置它们
我看到您已经在设置输出标题,所以这很好
现在,您可以查看数据库中的数据,并了解其“错误”的原因。我做了mysql\u client\u encoding()并得到了latin1,然后我做了mysql\u set\u charset(),然后再次运行mysql\u client\u encoding()并得到了utf8,但仍然存在相同的问题。您是否尝试在每个$myString
上分别应用fixEncoding()
,我已经登录到命令行并运行查询`从id=1000的地址选择ad地址1;所有输出都如预期的那样。那么我现在应该寻找什么呢?
$str = "Otivägen"; // already an UTF-8 string
echo utf8_encode($str); // outputs Otivägen
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+