【问题标题】:UTF8 -> Latin1 Difficulty, PHPUTF8 -> Latin1 难度,PHP
【发布时间】:2026-02-13 13:20:05
【问题描述】:

我正在丢失重音字符。

我从 PHP 下载了一个使用 UTF8 的 xml 文件,而我的 PHP 脚本使用的是 Latin1。我无法将 UTF8 转换为 Latin1。

我试过这个:

$meta=mb_convert_encoding($meta,'CP1252','UTF-8');

$meta=mb_convert_encoding($meta,'UTF-8');
$meta=mb_convert_encoding($meta,'CP1252','UTF-8');

但无论哪种方式,重音字符都被破坏并变成了 2 个字符。

输入:

<title>First book of zoölogy</title>

输出:

<title>First book of zoo?logy</title>

我自己想通了,请参阅下面的答案。谢谢大家的帮助!

【问题讨论】:

  • 请展示一些示例输入和输出,提供更多细节和代码。这太模糊了,无法具体回答。
  • 我添加了一个输入和输出示例。
  • 该示例显示的是第一个代码 sn-p 的结果?你确定你在函数中输入的文本是 UTF-8 编码的吗?
  • 元文件的标头说是UTF-8,但我想可能是在撒谎。
  • 你试过$meta = utf8_decode($meta)吗?

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


【解决方案1】:

更改表的排序规则做 Utf8_general_ci 并在连接到数据库之前使用:

mysql_set_charset("utf8");

我认为这可以解决您的问题。

【讨论】:

  • 一切都设置为 Latin1,因为这是我想要使用的,而不是 UTF8。我已经将 mysql_set_charset 设置为 Latin1。重音字符应该能够在一开始就从 UTF8 转换为 Latin1,它们是,之后没有使用 UTF8,但在某处字符被损坏。
  • @Alasdair。既然 utf8 提供了这么多,你为什么还要继续使用 Latin1..?
  • 因为它使用更少的字节,我不需要 UTF8。
  • @Alasdair。较少的字节不一定是真的,utf8 是可变宽度编码。基本子集不会比 latin1 占用更多空间。而且您现在可能不需要 utf8,但是当您需要将所做的任何事情扩展到国际字符集时,您会很高兴选择它..
  • 这永远不会扩展到拉丁字母之外,而专门使用 Latin1 的原因是我可以在 MySQL 数据库上拥有 255 个字符的可搜索索引。
【解决方案2】:

这解决了它:

$meta=iconv('UTF-8','CP1252//TRANSLIT',$meta);

我之前不知道iconv,我以为只有mb_strings可以使用,但是iconv效果很好。

【讨论】:

    【解决方案3】:

    也许您的 MySQL 服务器的默认字符集是 UTF-8。试试这个:
    在您的 MySQL 连接详细信息之后插入以下查询:

    mysql_query("SET NAMES latin1");
    

    【讨论】:

    • 不是,默认是latin1,现在看来这个问题是在字符串入库之前出现的,所以是php问题,不是mysql问题。