【问题标题】:Convert ISO-8859-2 to UTF-8 (Polish characters)将 ISO-8859-2 转换为 UTF-8(波兰语字符)
【发布时间】:2013-08-24 16:02:57
【问题描述】:

我正在尝试解析一个表示其字符集为 ISO-8859-2 的 XML 文件 (http://jstryczek.blox.pl/rss2)。我的数据库是 UTF-8,所以我想把它转换成 UTF-8。

为此,我在字符串上运行以下命令:

$content = iconv('ISO-8859-2', 'UTF-8//TRANSLIT', $content);

由于某种原因,我得到了一个奇怪的编码,所以:

Gdzie są różnice

通过:

Gdzie sÄ róşnice

有没有解释为什么波兰字符没有通过? UTF-8 不支持吗?

【问题讨论】:

  • UTF-8 支持所有波兰语字符,我敢肯定。
  • 您使用哪个数据库,如何定义列,如何将文本存储在数据库中,以及如何检索它? UTF-8 很好地支持这些字符。事实上,stackoverflow 网站完全采用 UTF-8 格式,如您所见,发布它们没有问题。
  • 我将 MariaDB 与 UTF8 中的表一起使用,客户端连接也是 UTF8。我认为某种隐式转换正在某处发生,只是不确定在哪里。
  • 您是否尝试过将连接字符集设置为 latin_2 并将数据按原样发送到数据库? MySQL(和我想象的 MariaDB)能够在从客户端发送的编码到数据库/表的编码之间进行转换。我以前用它来将 UTF-8 转换为 cp850 以便在 Windows cmd 中正确显示。
  • 原来,这就是我需要做的魔法。我有一些代码可以验证 UTF-8 中的某些字符,这些字符会扰乱隐式发生的转换。我将它包装在一个检查中,首先验证该字符串是 UTF-8,然后我的问题就消失了。我认为 Curl、PHP 或 MariaDB 都在进行隐式转换,而我的显式转换使其加倍,从而导致了问题。

标签: php character-encoding


【解决方案1】:

我通过将字符串更改为 JSON 来解决此问题,然后将所有波兰语特殊符号替换为 HTML 代码。我在结果下方添加:

        $specialChars = [
        '\u0105', # ą
        '\u0107', # ć
        '\u0119', # ę
        '\u0142', # ł
        '\u0144', # ń
        '\u00f3', # ó
        '\u015b', # ś
        '\u017a', # ź
        '\u017c', # ż
        '\u0104', # Ą
        '\u0106', # Ć
        '\u0118', # Ę
        '\u0141', # Ł
        '\u0143', # Ń
        '\u00d3', # Ó
        '\u015a', # Ś
        '\u0179', # Ż
        '\u017b', # Ż
    ];

    $polishHtmlCodes = [
        'ą', # ą
        'ć', # ć
        'ę', # ę
        'ł', # ł
        'ń', # ń
        'ó', # ó
        'ś', # ś
        'ź', # ź
        'ż', # ż
        'Ą', # Ą
        'Ć', # Ć
        'Ę', # Ę
        'Ł', # Ł
        'Ń', # Ń
        'Ó', # Ó
        'Ś', # Ś
        'Ź', # Ż
        'Ż', # Ż
    ];

    $result = str_replace($specialChars, $polishHtmlCodes, json_encode($string));
    var_dump(json_decode($result));

// prints
// e.g. 'Różowe okulary'

【讨论】:

  • html_entity_decode($string, null, 'utf-8') 怎么样?
  • 有一个错误-> 'ł', # ń应该是-> 'ń', # ń
【解决方案2】:

看来,这段文字已经用utf-8编码了,所以不需要解码。当我将此文件保存为 utf-8 并运行它时:

<?php
$content = 'Gdzie są różnice';
$content = iconv('ISO-8859-2', 'UTF-8//TRANSLIT', $content);
print $content;

我知道了:

Gdzie sÄ róşnice

这正是错误的文字,你知道了。

直接保存文本,已经是utf-8了。

【讨论】:

  • 然后服务器报告错误的编码,因为它通过 Content-Type: text/xml;字符集=ISO-8859-2。当我什么都不做时,我会得到“?”或丢弃非 ASCII 字符的字符。如果我只是卷曲网址,我会得到“?”在 UTF8 控制台中。有什么想法吗?
  • @hukir 也许,我错了,编码真的是 ISO-8859-2。你能把转换结果保存到文件中并检查它的编码吗?
  • 我使用 curl -O 直接保存文件,它使用 ISO-8859-1 保存,字符混乱。让我相信这是我从中获取数据的服务器的问题。好像它是一个 Windows 服务器,当我的 Ubuntu 服务器获取它时可能会导致问题。
【解决方案3】:
<?php
$content = 'Gdzie są różnice';
$content = mb_convert_encoding($content, "ISO-8859-2", "UTF-8");
print $content;
?>

【讨论】:

    猜你喜欢
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2020-01-25
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多