【发布时间】:2011-02-26 08:03:35
【问题描述】:
我只是出于好奇才问这个问题。一般来说,就我而言,文件是用单个字符集存储的。但是字符集类型会保存在哪里呢?是否可以将两种字符串(如std::string、std::wstring)放在同一个文件中?
【问题讨论】:
标签: c++ visual-c++ character-encoding logic
我只是出于好奇才问这个问题。一般来说,就我而言,文件是用单个字符集存储的。但是字符集类型会保存在哪里呢?是否可以将两种字符串(如std::string、std::wstring)放在同一个文件中?
【问题讨论】:
标签: c++ visual-c++ character-encoding logic
字符集的引入是为了让不同的程序能够以不同的方式解释相同的字符集(即十进制值大于 127 的单字节字符,或者换句话说,设置高位的单字节字符)方法。如果您想在文件或流中切换字符集的一部分,则必须以某种方式向您的程序发出信号,无论是在文件中还是在带外。
至于混合std::string 和std::wstring,虽然有可能,但充其量只是令人困惑。 strings(通常)是 ASCII,wstrings 是 Unicode。在生成文件时,您可以在其中放置一个信号或标记,告诉您的程序在读回文件时进行切换。
一般来说,如果您需要多个字符集,您应该使用 Unicode(可以用std::wstring 表示)。事实上,如果您要处理用户输入,那么您应该使用 Unicode。
去阅读 Joel Spolsky 的 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)。它应该有助于使事情更清楚。
【讨论】:
如果您的问题是关于源文件本身的编码,答案是 C++ 标准需要一个实现来支持以基本字符集编码的源文件。编译器实现可能支持额外的字符集。有关详细信息,请参阅您的编译器手册。
关于在同一个文件中使用std::string 和std::wstring 变量,是的,可以一起使用。
【讨论】:
字符编码完全免费。文件是字节的容器。您可以将文本编码为 ASCII、UTF8、Big5、... 编码字符的混合体,但如何解释每个字符由您决定。
约定不过是在文件的第一个位置放置一个标记,表示编码。 (参见维基百科上的Byte Order Mark)。
使用 xml 时,这一点变得更加明确(但 not completely 已覆盖):编码必须在第一行,并且该行必须在 utf8 中。 (如果省略编码,则表示:“utf-8”)
【讨论】:
文件只是一个字节序列。一个字节只是一个 8 位(在任何现代硬件上)二进制数,如果解释为无符号,则范围从 0 到 255,如果解释为有符号,则范围从 -128 到 127。
这些字节的含义取决于设计该特定文件格式的人。它可能包含以某种方式指示或在文件格式文档中指定的某种单一编码编码的字符序列,它可能包含不同编码的肮脏混乱,无法区分它们(我在现实中看到过这样的事情,关键应用程序),它可以包含二进制和文本数据的混合,或者它可以包含与任何字符或字符集无关的二进制数据。
但是,如果您的文件格式不是二进制文件,也就是说,如果它包含文本且仅包含文本,那么混合字符集通常是一个非常糟糕的主意。使用统一的和 ASCII 兼容的东西,比如 UTF-8 可能是最好的方法。即使是二进制格式,以相同的编码方式对所有文本数据进行编码仍然是一个好主意。 UTF-8 或 UTF-16(甚至 UTF-32)似乎是不错的选择。但是,有时您必须处理不同的要求。例如,二进制格式可能具有“旧”版本的标头和“新”版本。旧的可能使用一些遗留字符集,而新的可能使用一些 Unicode。没关系。但是对于纯文本格式,我还没有看到一种广泛使用的允许混合字符集的格式。有些允许您为每个文件选择一个字符集,并在某处放置一个标记(如 XML、HTML、Python 源代码)。
【讨论】: