【问题标题】:How is this website fixing the encoding?该网站如何修复编码?
【发布时间】:2010-05-15 12:03:57
【问题描述】:

我正在尝试转这个文本:

×וויר. העתיד של רשתות חברתיות והתקשורת ×©×œ× ×•

进入正文:

אוויר. העתיד של רשתות חברתיות והתקשורת שלנו

不知何故,这个网站:

http://www.pixiesoft.com/flip/

可以做到,我想知道我自己如何才能做到(使用任何编程语言或软件)

仅将文件保存为 UTF8 是不行的。

我提出这个问题的动机是我有一个朋友导出的带有乱码文本的 XML 文件,我想将其转换为更正后的希伯来语文本文件。

XML 导出最初是由 MySQL 导入和导出造成的乱码,但我没有修复它或追溯问题所需的信息。

谢谢。

【问题讨论】:

    标签: mysql encoding character-encoding hebrew utf-8


    【解决方案1】:

    由于问题是双编码 UTF8 字符串的 MySQL 故障,因此 MySQL 是解决该问题的正确方法。

    运行以下命令即可解决 -

    • mysqldump $DB_NAME -u $DB_USER -p -h $DB_HOST.EXAMPLE.NET --add-drop-table --default-character-set=latin1 > export.sql - latin1 用于强制 MySQL 不拆分字符,否则不应使用。
    • cp export{,.utf8}.sql - 制作备份副本。
    • sed -i -e 's/latin1/utf8/g' export.utf8.sql - 将文件中的 latin1 替换为 utf8,以便将其导入为 UTF-8 而不是 8859-1。
    • mysql $DB_NAME -u $DB_USER -p -h $DB_HOST.EXAMPLE.NET < export.utf8.sql - 将所有内容导入数据库。

    这将在大约十分钟内解决问题。

    【讨论】:

    • 顺便说一下,这是 sed 命令中的全部差异 - diff export.* 10c10 /; --- > /!40101 SET NAMES utf8 */;
    【解决方案2】:

    您可能想查看here - 这个问题的公认答案显示了一种如何猜测byte[] 编码的方法。那么,您所要做的就是从乱码中获取正确的字节。 当然,猜测可能总是失败......

    【讨论】:

      【解决方案3】:

      如果您仔细观察这些乱码,您会发现每个希伯来字符都被编码为 2 个字符 - 似乎 של 被编码为 של

      这表明您将 UTF8 或 UTF16 视为 ASCII。转换为 UTF8 将无济于事,因为它已经是 ASCII 并且会保留该编码。

      您可以读取每对字节并从中重构原始 UTF8。

      这是我想出的一些 C# - 这非常简单(不能完全工作 - 假设太多),但我可以看到一些字符转换正确:

      private string ToProperHebrew(string gibberish)
      {
         byte[] orig = Encoding.Unicode.GetBytes(gibberish);
         byte[] heb = new byte[orig.Length / 2];
      
         for (int i = 0; i < orig.Length / 2; i++)
         {
           heb[i] = orig[i * 2];
         }
      
         return Encoding.UTF8.GetString(heb);
      }
      

      如果似乎每个字节都被重新编码为两个字节 - 不确定为此使用了什么编码,但丢弃一个字节似乎对于大多数双倍字符来说是正确的。

      【讨论】:

      • 感谢奥德!你会如何建议我这样做? (有没有可以为文件做的转换器?)
      • @Tal:扩展他的代码示例并编写一个小实用程序。不难。
      • 从技术上讲,这并不能解决问题,因为它只会破坏更多的编码。我考虑过使用 sed 进行海量搜索和替换,但不需要,因为我们可以强制 mysql 正确导出数据。
      【解决方案4】:
      【解决方案5】:

      根据 Oded 和 Teddy 的回答,我想出了这个对我有用的方法:

      public String getProperHebrew(String gibberish){
          byte[] orig = gibberish.getBytes(Charset.forName("windows-1252"));
      
          try {
              return new String(orig, "UTF-8");
          } catch (UnsupportedEncodingException e) {
              e.printStackTrace();
              return "";
          }
      }
      

      【讨论】:

        【解决方案6】:

        gibberish.encode('windows-1252').decode('utf-8', 'replace')

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-24
          • 1970-01-01
          • 2019-06-10
          • 2023-04-02
          • 1970-01-01
          • 2021-12-11
          • 2013-08-15
          • 2018-04-03
          相关资源
          最近更新 更多