首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >智能引号不能正确转换为UTF8

智能引号不能正确转换为UTF8
EN

Stack Overflow用户
提问于 2012-02-22 11:51:10
回答 3查看 13K关注 0票数 4

我有一个PHP脚本,它导入和解析XML文件并将数据保存到数据库中:

utf8

  • Page's

  • 数据库排序规则:utf8_general_ci,字符集:字符集:utf-8
  • XML文件:ANSI,包含智能引号(来自MS Word)

因此,在导入过程中,在保存到数据库并随后显示在页面上之前,我会对XML文件中的文本执行utf8_encode()操作。

但是当成功导入并保存到DB中时,

  • 数据库:智能引号保存为?字符(从CMD查看)
  • 页面:智能引号显示为

对于为什么智能引号没有被正确转换,即使在使用utf8_encode()时,有任何想法吗?

编辑:

@Tomalak: XML文件实际上是.txt,没有XML声明(<?xml ... ?>),也没有根元素。我的脚本实际上添加了一个根元素,这样解析器就可以工作了:

utf8_encode('<article>' . file_get_contents($xmlfile) . '</article>');

似乎我需要添加一个XML声明..?如果是的话,它应该是什么样的呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-22 15:09:36

如果您的XML字符串(即文件内容)没有被编码为UTF-8,那么您需要一个表示文件编码的XML声明。如果缺少XML声明,解析器将假设UTF-8。

只要您不使用“特殊”字符(即ASCII范围以外的任何字符),它将在没有声明的情况下工作,即使您的文件不是真正的UTF-8编码。这是因为UTF-8与ASCII字节兼容.但是,只要在其中一个代码页上使用字符--比如“智能引号”--它就会中断,因为这些字符用UTF-8中的不同字节表示。

在您的示例中,遗留编码中有文本文件,您可以用根元素包装这些文本文件,以便将它们转换为格式良好的XML。因此,您需要自己添加XML声明:

代码语言:javascript
复制
'<?xml encoding="Windows-1252"?><article>'.file_get_contents($xmlfile).'</article>'

这样,您就可以指示DOMDocument如何解释字符串中的字节。我以为Windows-1252是你的,因为你说了ANSI,提到了卷曲引号。

事实上,95%的情况下,这就是人们真正的意思,即使在Linux上,即使他们说ISO-8859-1 (或latin-1),这几乎是,但不是完全相同的事情。

为了确保您可以在十六进制编辑器中打开文本文件,请找出一些特殊字符,并将它们的字节值与可疑编码进行比较。为了Windows-1252。对于卷曲引号,预期的字节值为:

  • 147 (0x93)
  • 148 (0x94)

一旦声明了字符串中各个字节的含义,DOMDocument就可以理解它们并做正确的事情。

在DB中,我强烈怀疑有一些自动编码转换正在进行。我承认,我对PHP/mySQL/Unicode集成还不太了解,所以可以肯定地说。

票数 8
EN

Stack Overflow用户

发布于 2012-02-22 12:23:17

它们被正确地转换,因为utf8_encode做了它应该做的事情,并将它们从输入流中移除。

utf8_encode将ISO-8859-1中的文本转换为UTF-8编码.ISO-8859-1不包含智能引号字符.您的网页可能在浏览器中被视为MSWIN1252编码,其中确实包含智能引号字符,并且通过在浏览器上调用utf8_encode来强制PHP的输入到ISO-8859-1。这意味着将其输入数据库的唯一字符是:http://en.wikipedia.org/wiki/ISO/IEC_8859-1#Codepage_layout

要解决这个问题,您必须确保网页本身使用UTF-8编码,并从代码中删除所有UTF 8_encode/UTF 8_decode语句。本页解释如何正确使用UTF-8:http://malevolent.com/weblog/archive/2007/03/12/unicode-utf8-php-mysql/

票数 1
EN

Stack Overflow用户

发布于 2021-05-19 20:22:11

是的,问题是有两种聪明的引号。

windows-1252和拉丁文-1

utf8_encode假设它是拉丁语-1,所以它的智能引号是错误的。

如果我们知道输入的数据是windows-1252,我们可以使用iconv来转换它。

代码语言:javascript
复制
$string=iconv ( "Windows-1252" , "UTF-8" , $oldstring );

这才是真正的答案。

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

https://stackoverflow.com/questions/9394210

复制
相关文章

相似问题

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