我正在编写一个小程序,它使用许多不同的通用语言编写CSV电子表格中的字符,并将它们注入特定于每种语言的较小文件中.
我知道8位字符串对于这个来说太小了,并假设16位wchar_t
数据类型就足够了.(我对表情符号或死语言不感兴趣,只有日语,普通话,西班牙语和其他一些语言.)然而,研究这个主题,这项任务似乎wchar_t
还是wstring
不够?"UTF-8"和"语言环境"经常出现,但是这些主题对于我想要做的事情感觉太远,太复杂/一般......如果可以的话,我现在想要避开它们!
给定一个包含这些常用语言的CSV文档,在Windows上,是否可以将这些字符读入内存,解析它们,然后使用标准的CI/O /解析库和最小的Unicode知识将它们写入新文件?例如,wstring
,fgetws()
,wcstok()
,和wcsstr()
是我目前舒适的所有功能.(我确实有一天会学习Unicode,但是这对我来说太过重要了.)
我的数据以这样的方式解析,我只查找分隔符,如引号,标点符号和一些英语单词.我正在读取的文件要么是由程序本身生成的,要么是从电子表格程序中导出的......我不知道如何使用C库指定编码,它可能是自动的吗?电子表格程序允许我选择编码,虽然它不提供UTF-16作为选项,这是不幸的,因为这似乎映射最简单到我的实现wstring
(16位).
如果您不必操作/搜索ASCII字符集之外的字符,我强烈建议使用UTF-8以及普通char
和std::string
函数.这将为您节省许多麻烦并增加可移植性.
关于UTF-8的事情是它完全按照ASCII的方式编码"常用"符号.它还确保多字节字符的任何部分都不具有与ASCII字符相同的值,因此不存在混淆的危险,您可以使用"普通"函数来搜索分隔符,甚至可以将这些字符串与普通ASCII混合使用字符串.这样,您也不需要担心16比32 wchars
或不同的endianess.最后,UTF-8是互联网上的通用交换格式.
至于如何创建UTF-8字符串:在程序中,您可以只使用字符串文字作为前缀u8
.如果您的编辑器不支持相关符号,则可以使用Unicode转义序列.
否则使用文本程序的/控制台编码选项.标准的读写功能同样与UTF-8编码无关.
为了证明我的意思,这是一个例子:
#include#include const char* u8cString = u8"??\u002dHello;World??"; std::string u8cppString(u8cString); int main() { std::string input; std::cin >> input; u8cppString.insert(0,input); u8cppString.append("ASCII-text"); size_t delPos = u8cppString.find(';'); std::string first = u8cppString.substr(0, delPos); std::string second = u8cppString.substr(delPos+1); std::cout << first << "\n"; std::cout << second << std::endl; }
当然,这个代码对于它所实现的内容来说过于复杂,但我想证明即使使用一些随机的中文字符,所有函数都按预期工作.
现在,中文字符是否在控制台上正确显示取决于系统设置(Windows有些问题)但您应该看到所有ASCII字符,并且换行符位于;
分隔符的位置.