【问题标题】:How to detect Windows-1251 encoded characters [duplicate]如何检测 Windows-1251 编码字符 [重复]
【发布时间】:2013-07-06 20:03:00
【问题描述】:

是否有正确的方法来检测Windows-1251 编码字符?

IMO,与多字节本机字符不同,Windows-1251 是一种 8 位字符编码,因此无法将其与其他 8 位本机字符(如 latin1)区分开来。如果我在这方面有错误,请纠正我。

我的第一条线索是locale,如果语言环境是ru,我会将所有non-ascii 字符都视为Windows-1251

有没有更好的方法?

更新:

这是我的问题的上下文,MP3 文件的ID3 信息中有一些Windows-1251 编码字符,我必须检测Windows-1251 编码字符,然后使用@ 将它们转换为UTF-16 987654331@ ,否则那些Windows-1251 编码的字符将在我的系统上表示不可读(Android)。我认为也许你们中的一些人有更好的方法。

【问题讨论】:

  • 你想从什么检测这个?
  • 部分 MP3 文件的 ID3 标签中有西里尔字符,在 Windows-1251 中编码。
  • 那么您希望能够获取 MP3 文件并辨别 ID3 标签是否以 1251 编码?
  • 我想知道ID3标签是否以1251编码。然后我可以使用icu4c将1251正确转换为UTF。因为在我的系统(Android)中,一些 1251 编码字符表示不可读。我说清楚了吗?

标签: android character-encoding cyrillic


【解决方案1】:

当输入一个 8 位字符的数组时,没有可靠的方法来检测这些字符使用了哪种 8 位编码。

【讨论】:

  • 那么使用locale其实是一个正确的方法?
  • 没有。我的机器不使用 1251,当您将文件移动到我的机器时,您的文件仍将包含 1251 编码标签。
  • 我的意思是,如果语言环境是 ru(Russian),那么我将单字节非 ascii 字符视为 Windows-1251。因为我们的目标市场是俄罗斯,所以我遇到了一些俄罗斯 MP3 文件中的不可读字符问题。
  • @Alan 您无法可靠地检测文件的代码页,需要将其与文件一起告知。做到这一点的唯一方法是构建一套非常复杂的启发式算法,这将需要大量的工作来研究、测试和以其他方式使工作正常。例如,在区分 ISO-8859-1 和 Windows-1252 时出现了大问题,两者之间的差异非常小。此问题的更多信息:How can I detect the encoding/codepage of a text file.
  • 如果文件中不包含识别信息,我建议让用户识别他们的文件。几乎所有的文本编辑器都是这样做的,除了那些猜错的(比如记事本)。
【解决方案2】:

GetACP 函数可用于确定这一点。它返回系统当前活动的 ANSI 代码页的标识符。

可在here 找到已记录的代码页标识符列表。您要查找的是1251,它对应于“ANSI Cyrillic (Windows)”代码页。

从代码中使用非常简单;例如在 C 中:

#include <Windows.h>

int main()
{
    if (GetACP() == 1251)
    {
        MessageBoxW(NULL,
                    L"Your system uses the ANSI Cyrillic code page.",
                    L"Code Page Detection",
                    MB_OK | MB_ICONINFORMATION);
    }
    return 0;
}

【讨论】:

  • 谢谢,但也许你因为我的英语不好而误解了我的问题。实际上,我必须区分本机字符以查看它是否是 Windows-1251(Cyrillic) 编码的,如果是,我将使用 icu4c 将它们转换为 UTF。我说清楚了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 2011-11-05
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
相关资源
最近更新 更多