是否可以将两种字符集放在同一个文件中

时间:2011-02-26 08:03:36

标签: c++ visual-c++ character-encoding logic

我刚刚好奇地问了这个问题。一般而言,就我而言,文件存储有单个字符集。但是保存的字符集类型在哪里?是否可以将两种字符串(如std :: string,std :: wstring)放在同一个文件中?

4 个答案:

答案 0 :(得分:4)

引入字符集以允许不同的程序解释相同的字符集(即,十进制值超过127的单字节字符,或者换句话说,设置其高位的字符)在不同的字符集中方法。如果你想在文件或流的中途切换字符集,你必须以某种方式在文件或带外信号发送你的程序。

关于混合std::stringstd::wstring,虽然有可能,但它最多会让人感到困惑。 string是(通常)ASCII,wstring是Unicode。生成文件时,您可以在其中放置一个信号或标记,告诉您的程序在重新读取时切换。

通常,如果您需要多个字符集,则应使用Unicode(可以使用std::wstring表示)。实际上,如果您正在处理用户输入,那么您应该使用Unicode。

去读Joel Spolsky的The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)。它应该有助于使事情更加清晰。

答案 1 :(得分:1)

字符编码完全免费。文件是字节的容器。您可以将文本编码为ASCII,UTF8,Big5,...编码字符的混合,但是由您决定如何解释每个字符。

约定是将标记放在文件的第一个位置,表示编码。 (维基百科上的cfr Byte Order Mark)。

当使用xml时,这变得更加明确(但not completely覆盖):编码必须在第一行,并且该行必须在utf8中。 (如果省略编码,则表示:“utf-8”)

答案 2 :(得分:1)

如果你的问题是关于源文件本身的编码,答案是C ++标准需要一个实现来支持在基本字符集中编码的源文件。编译器实现可以支持其他字符集。有关更多信息,请参阅编译器手册。

关于在同一个文件中使用std::stringstd::wstring变量,是的,您可以一起使用。

答案 3 :(得分:1)

文件只是一个字节序列。字节只是一个8位(在任何现代硬件上)二进制数,如果解释为无符号,则范围为0到255;如果解释为有符号,则为-128到127.

这些字节对于那些设计特定文件格式的人来说意味着什么。它可能包含一些字符序列,这些字符编码有某种单一编码,以某种方式指示或在文件格式文档中指定,它可能包含不同编码的混乱,无法区分它们(我在实际中看到过这样的东西,它可以包含二进制和文本数据的混合,也可以包含与任何字符或字符集无关的二进制数据。

但是,如果你的文件格式不是二进制文件,也就是说,如果它包含文本而只包含文本,那么混合字符集通常是一个非常糟糕的主意。使用像UTF-8这样的统一和ASCII兼容的东西可能是最好的方法。即使是二进制格式,以相同的编码对所有文本数据进行编码仍然是个好主意。 UTF-8或UTF-16(甚至UTF-32)似乎是很好的选择。但是,有时您必须处理不同的要求。例如,二进制格式可以具有标题的“旧”版本和“新”标题。旧的可能正在使用一些遗留字符集,而新的字符集可能正在使用某些Unicode。没关系。但是当谈到纯文本格式时,我还没有看到一种广泛使用的格式,它允许混合字符集。有些允许您为每个文件选择一个字符集,并在某处放置标记(如XML,HTML,Python源)。