读取具有未知UTF8字符串和已知ASCII混合的文件

时间:2015-02-17 16:38:42

标签: c++ string utf-8

很抱歉这个令人困惑的标题,我不确定如何自己说出来。我会尽量让问题保持简单。

我正在研究一个保持"目录"字符串。此目录只是一个以特定方式编制索引的简单平面文本文件。文件的语法必须是ASCII,但字符串的内容可以是UTF8。

文件示例:

{
    STRINGS: {
        THISHASTOBEASCII: "But this is UTF8"
        HELLO1: "Hello, world"
        HELLO2: "您好"
    }
}

读取UTF8文件并不是问题所在,我不太关心引号之间的内容,因为它只是简单地复制到其他地方,没有对其进行任何更改字符串。

问题是我需要解析括号和字符串的标签,以便将UTF8字符串正确存储在内存中。我该怎么做?

编辑:刚刚意识到我过度复杂了。我应该复制并存储两者之间的任何内容,因为UTF8可以读入字节> _<。标记为结束。

2 个答案:

答案 0 :(得分:2)

您可以使用您提到的UTF-8处理方法进行此操作。

实际上,一个字节的UTF-8字符也遵循ASCII规则。

1字节UTF-8类似于0XXXXXXX。更多字节UTF-8。总字节数以1开头,后跟零,然后其他字节以10开头。

像3字节一样:1110XXXX 10XXXXXX 10XXXXXX

5字节:111110XX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX

当您浏览字符数组时,只需检查您阅读的每个字符。您将知道它是ASCII(通过& 0x80得到假)还是多字节字符的一部分(通过& 0x80得到)

注意:所有unicode都是3字节的UTF-8。 Unicode当前使用2个有效字节(16位),3字节UTF-8也是16个valit位。(参见上面列出的' X')

答案 1 :(得分:1)

ASCII是UTF-8的子集,UTF-8可以使用标准的8位字符串解析函数进行处理。因此整个文件可以作为UTF-8处理。只需剥掉你不需要的部分。