首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UTF-8,PHP和XML Mysql

UTF-8,PHP和XML Mysql
EN

Stack Overflow用户
提问于 2009-11-24 16:09:50
回答 6查看 3.1K关注 0票数 3

我在解决这个问题上有很大的困难:

我有一个编码latin1_swedish_ci的mysql数据库和一个存储名称和地址的表。

我正在尝试输出一个UTF-8 XML文件,但是下面的字符串有问题:

Otivägen --当我访问该文件时,它被输出为Otivägen。也是当我打开它的时候我得到了

"An invalid character was found in text content. Error processing resource

我有以下代码:

代码语言:javascript
运行
复制
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);

实际的XML输出如下:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8" ?>
<myxml>
    ....
    <node>Otivägen</node>
    ....
</myxml>

知道如何输出文件吗?所以在vim中,文件读的是Otivägen,而不是Otivägen

编辑:

我做了mysql_client_encoding(),得到了latin1

然后我做了mysql_set_charset()

再次运行mysql_client_encoding()并获得utf8,但仍然是输出问题。

编辑2

我已经登录到命令行并运行查询SELECT address1 FROM address WHERE id = 1000;

代码语言:javascript
运行
复制
SELECT address1 FROM address WHERE id = 1000;
Current database: ftpuser_db

+-------------+
|   address1  |
+-------------+
| Otivägen 32 |
+-------------+
1 row in set (0.06 sec)

提前感谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-11-25 13:16:49

我认为你做的一切都是正确的,除了你的终端是拉丁文-1。

用于C3 A4的UTF-8序列,如果显示为拉丁文-1,则为圣保罗.

票数 2
EN

Stack Overflow用户

发布于 2009-11-24 16:11:31

您的MySQL连接编码是否正确地设置为UTF-8

有关更多细节,请查看字符集()编码()

票数 2
EN

Stack Overflow用户

发布于 2009-11-27 01:59:24

哦,天哪。UTF8问题可能是一个真正的痛苦,当某些事情为您重新编码时,它们几乎是不可能解决的。

您确实需要从一端开始,并确保每个进程都是UTF8。这将删除过程中的东西,从解释错误的数据和为您“转换”它。但值得注意的是,它还可以让您更容易地发现有错误编码的文本(是的,我遇到了这个问题)。

而且,如果表中的UTF8数据没有设置为UTF8,而且可能是错误编码的,则需要在数据重新编码之后最后再执行这些表。否则,您将无法挽回地损坏数据。我也有过这个问题。

第一步:

  • 检查您的终端是否符合UTF8。侏儒终端机是。克伦特是。ETerm不是。
  • 检查你的朗设置在你的外壳。它可能应该有..UTF 8在它的值的末尾。
  • 检查vim是否正确地选择了UTF8设置。您可以向:set encoding查询

这意味着您的文件将在UTF8中进行编辑。

现在我们检查MySQL。

在MySQL CLI中,执行show variables like 'character_set%';。结果可能是:

代码语言:javascript
运行
复制
+--------------------------+----------------------------+
| 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

set names utf8;将更改其中的大多数,您可能需要在数据库中的每一个新连接中都这样做。这是我在上一次申请中必须采用的解决方案。要更改的其他设置在my.cnf文件中,为此,我需要将您引向文献资料。你不太可能需要把它们全部设置好。

我看到您已经设置了输出头,所以这很好。

现在,您可以查看数据库中的数据,并了解其“错误”的原因。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1791082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档