【发布时间】:2021-05-02 02:55:21
【问题描述】:
现在 Windows 10 记事本不需要 unicode 文件具有 BOM 标头,并且默认情况下不对标头进行编码。这确实破坏了检查标头以确定文件中的 Unicode 的现有代码。我现在如何在 C++ 中判断文件是否为 unicode? 来源:https://www.bleepingcomputer.com/news/microsoft/windows-10-notepad-is-getting-better-utf-8-encoding-support/
我们要确定Unicode的代码:
int IsUnicode(const BYTE p2bytes[3])
{
if( p2bytes[0]==0xEF && p2bytes[1]==0xBB p2bytes[2]==0xBF)
return 1; // UTF-8
if( p2bytes[0]==0xFE && p2bytes[1]==0xFF)
return 2; // UTF-16 (BE)
if( p2bytes[0]==0xFF && p2bytes[1]==0xFE)
return 3; // UTF-16 (LE)
return 0;
}
如果这么痛苦,为什么没有一个典型的函数来确定编码?
【问题讨论】:
-
这不太可能。您可以通过查看内容猜测并尝试将其解码为例如UTF-8 或类似的。如果失败,则回退到操作系统的当前设置。
-
“现在 Windows 10 不需要 unicode 文件具有 BOM 标头。” - 此声明的来源是什么?什么时候需要文件中的任何内容?
-
这里只有启发式可以提供帮助。如果每第二个字节的大部分为空,那么该文件很可能是一个 unicode 文件
-
notepad.exe 行为的变化与整个 Windows 10 的行为变化相差甚远......
-
@dxiv "看看
IsTextUnicode" - 这是记事本使用的,can report wrong results 正因为如此。