1

我试图把这段文字:

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

进入本文:

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

不知何故,这个网站:

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

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

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

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

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

谢谢。

4

6 回答 6

4

由于问题是双编码 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- 将所有内容导入数据库。

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

于 2010-05-16T09:13:52.057 回答
2

如果您仔细查看这些乱码,您会发现每个希伯来语字符都被编码为 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);
}

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

于 2010-05-15T12:14:35.300 回答
2

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

于 2010-05-15T12:24:02.693 回答
1

您可以使用元标记为您的页面设置正确的编码。这是一个示例,您可以如何做到这一点:

<meta http-equiv="Content-Type" content="text/html; charset=Windows-1255" />

我想这种编码可以完成工作。

于 2010-05-15T12:08:48.940 回答
1

根据 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 "";
    }
}
于 2011-12-16T15:49:54.543 回答
0

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

于 2010-05-26T13:41:17.460 回答