【问题标题】:Problem converting ISO8859-1 to UTF-8 in PHP在 PHP 中将 ISO8859-1 转换为 UTF-8 时出现问题
【发布时间】:2010-09-12 01:09:54
【问题描述】:

我正在尝试转换取自 MySQL 数据库的 ISO8859-1 字符串,并使用 php 将其转换为 UTF-8。但是,当我使用 utf8_encode 函数时,它会从字符串中删除几乎所有的撇号(例外情况似乎在 html 字段中)。

谢谢

【问题讨论】:

  • 您是否尝试在编码之前对字符串调用 stripslashes()?

标签: php mysql utf-8 character-encoding apostrophe


【解决方案1】:

您的“ISO-8859-1”内容实际上可能不是 ISO-8859-1。

当您说Content-Type: text/html; charset=iso-8859-1 时,由于令人讨厌的历史原因,浏览器实际上并不使用 ISO-8859-1。他们确实使用 Windows 代码页 1252(西欧),与 ISO-8859-1 非常相似,但又不一样。

特别是,0x80-0x9F 范围内的字节表示 ISO-8859-1 中不可见且很少使用的控制代码。但是 cp1252 在此范围内添加了一些印刷细节和其他扩展,包括“智能引号”。当您在 MS Word 中编写撇号时,它会将其更改为一个向左的智能引号 ,因此在 Word 和其他 Office 应用程序中输入的原始文本通常会出现编码问题。

要将 cp1252 转换为 UTF-8,您必须使用 iconv('cp1252', 'utf-8', $somestring) 而不是与“真实” ISO-8859-1 绑定的 utf8_encode

【讨论】:

  • 我认为更公平的说法是浏览器并不总是使用 ISO-8859-1(又名 Latin-1)。如果不是,他们不一定使用 Windows 代码页,尤其是。在非 Windows 平台上。
  • @StaxMan:在网络的早期,你是对的,存在各种不兼容的行为。但是今天,当前的浏览器在指定 ISO-8859-1 时都使用 cp1252。 HTML5 standardises 这个和其他讨厌的编码替换。遗憾的是,这种丑陋的行为已成为标准,并且无法指定“ISO-8859-1,我是认真的!”......但是我们都在使用 UTF-8,所以谁在乎,对吧? :-)
  • 哦?好像我今天学到了一些新东西……这很有趣(是的,非常混乱!)。同意 UTF-8(是的,我知道,不是每个人都在使用它),我实际上很喜欢 JSON,决定它是 UTF-xx,仅此而已。
【解决方案2】:

一种可能性是使用 Iconv。我以前用过,挺好用的。

http://php.net/manual/en/function.iconv.php

它有一个可以近似字符的TRANSLIT选项。

【讨论】:

    猜你喜欢
    • 2012-05-16
    • 2011-04-12
    • 2017-08-23
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多