当前位置:  开发笔记 > 编程语言 > 正文

如何在没有UTF-8特定代码的情况下解析多语言文档

如何解决《如何在没有UTF-8特定代码的情况下解析多语言文档》经验,为你挑选了1个好方法。

我正在编写一个小程序,它使用许多不同的通用语言编写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位).



1> MikeMB..:

如果您不必操作/搜索ASCII字符集之外的字符,我强烈建议使用UTF-8以及普通charstd::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字符,并且换行符位于;分隔符的位置.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有