我正在使用unicode / wide字符,我正在尝试创建一个toString方法(Java ::toString equiv)。 ostream是否会处理宽字符,如果有的话,是否有办法警告流的消费者它是unicode出来的呢?
答案 0 :(得分:3)
ostream
和其他C ++都不了解Unicode。通常用C ++编写字符串转换如下:
template<typename Char, typename Traits>
std::basic_ostream<Char, Traits>&
operator<<(std::basic_ostream<Char, Traits>& stream, const YourType& object) {
return stream << object.a << object.b; // or whatever
}
是否得到类似Unicode的东西取决于实现。 C ++中的流从不是Java意义上的文本流,而C ++的字符串不是Java意义上的字符串。如果您想要一个真正的Unicode字符串,您可能需要查看ICU library。
答案 1 :(得分:0)
宽字符串不可移植,最好在C ++中避免。根据平台的不同,它们可以是UTF-16,UTF-32甚至是非Unicode。
C ++中的常见方法是在内部使用UTF-8编码的多字节with open(processing_log, 'ab') as f_out:
process = subprocess.Popen(
['python', PATH_TO_PYTHON_SCRIPT, PATH_TO_CONFIG_FILE],
stdout=f_out,
stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
字符串,并在必要时在系统边界进行转码。大多数现代系统(例如Linux和macOS)均可与UTF-8配合使用,因此可以将它们传递到输出流。由于遗留代码页,Windows是最成问题的。您可以将Boost Nowide或the {fmt} library用于便携式UTF-8输出。
免责声明:我是{fmt}的作者。