【发布时间】:2013-09-19 18:50:39
【问题描述】:
我正在尝试帮助一位朋友完成一个应该是 1H 并且现在已经 3 天的项目。不用说我感到非常沮丧和愤怒 ;-) ooooouuuu... 我呼吸。
所以用 C++ 编写的程序只是读取一堆文件并处理它们。问题是我的程序读取使用 UTF-16 编码的文件(因为这些文件包含用不同语言编写的单词)并且对 ifstream 的简单使用似乎不起作用(它读取并输出垃圾)。我花了一段时间才意识到这是因为文件是 UTF-16 格式的。
现在我整个下午都在网上寻找有关阅读 UTF16 文件并将 UTF16 行的内容转换为字符的信息!我就是看不出来!这是一场噩梦。我尝试了解以前从未使用过的<locale> 和<codecvt>、wstring 等(我专注于图形应用程序,而不是桌面应用程序)。我就是看不懂。
这就是我所做的一切(但不起作用):
std::wifstream file2(fileFullPath);
std::locale loc (std::locale(), new std::codecvt_utf16<char32_t>);
std::cout.imbue(loc);
while (!file2.eof()) {
std::wstring line;
std::getline(file2, line);
std::wcout << line << std::endl;
}
这是我能想到的最大值,但它甚至不起作用。它并没有做任何更好的事情。但问题是我一开始就不明白我在做什么。
所以请帮忙!我什至可以阅读 G*** D*** 文本文件,这真是太疯狂了。
最重要的是,我的朋友使用 Ubuntu(我使用 clang++),而这段代码需要 -stdlib=libc++,这似乎不被他的 gcc 支持(即使他使用了一个非常高级的 gcc 版本,即4.6.3 我相信)。所以我什至不确定使用 codecvt 和 locale 是一个好主意(如“可能”)。会有更好的(另一种)选择吗?
如果我仅从命令行(使用 linux 命令)将所有文件转换为 utf-8,我是否会丢失信息?
非常感谢,如果你能帮助我,我将永远感激你。
【问题讨论】:
-
您不会丢失任何将 UTF-16 转换为 UTF-8 的信息。我认为你的错误在于认为 C++ 会为你做这件事。我不完全确定这一点,但我不相信它会。在任何情况下,我都会手动编写 UTF-16 到 UTF-8 的转换。很简单,肯定会花不到三天时间。
-
好吧,问题在于,我没有阅读有关 UTF-16 的内容,而是愚蠢地试图通过从网络上复制/粘贴一些我不完全理解的代码来暴力破解解决方案...... ;-( 那么你确定从 16 转换为 8 不会导致信息丢失吗?问题是为什么首先使用 UTF-16 作为外语。我认为这是必要的,因为有些字母表有更多的字符比你可以用 utf-8 编码吗?
-
UTF-16 和 UTF-8 都是 Unicode 的完整编码。我相信你不会丢失任何信息。
-
可能使用 UTF-16,因为这些文件来自 Java/DotNET 背景。 Unix 上没有人会考虑使用 UTF-16 做任何事情。 (UTF-8 实际上比 UTF-16 可以表示 更多 个字符。)
-
gcc 尚不支持 C++11 的 unicode 转换,如果您不想手动编写它们,则需要诸如 boost.locale 之类的库来进行移植。跨度>
标签: c++ ubuntu utf-8 ifstream utf-16