【问题标题】:How to output/Input multibyte symbols?如何输出/输入多字节符号?
【发布时间】:2021-03-30 13:35:12
【问题描述】:

经过大量搜索后,我开始使用那个奇怪的代码:

ofstream myfile;
    string chars =  "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    myfile.open ("alphabet.txt");
    for (int i = 0; i < 66; i+=2) {
        myfile << chars[i] <<chars[i+1] << "\n";
    }
    myfile.close();

但是真的没有办法从 std::string 中得到一个宽字符吗?

【问题讨论】:

  • std::string 包含chars,它总是包含chars,它总是包含chars。对于非拉丁字符,一种选择是使用区域编码,例如 KOI8-R,但是随着时间的推移,KOI8-R 和其他字符集的使用已被弃用,现代 C++ 实现通常默认使用多字节 UTF-8 来表示非拉丁字符- 拉丁字符,其中每个字符,如“б”,由多字节序列表示。
  • 我知道,但是为什么没有内置方法来获取这些字母?!
  • C++库确实有一些类可以在各种编码和Unicode之间进行转码,但是使用起来很别扭,也不是很流行。大多数需要处理 Unicode 的应用程序将使用几个库之一来执行此操作,例如 iconv
  • @DmitrySokolov 我猜是因为 C++ 早于 Unicode 的广泛采用。

标签: c++ unicode utf-16 stdstring


【解决方案1】:

这在我的机器上工作。我的源代码文件是 UTF-8。该字符串采用 UTF-16 格式。输出为 UTF-16LE。

随着时间的推移,C++ 在处理 Unicode 字符串方面已经有所进步,但仍有很大的改进空间。

#include <fstream>
#include <string>

using std::ofstream;
using std::string;

int main() {
    auto chars = u"абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    auto myfile = ofstream("alphabet.txt");
    for (char16_t const* p = chars; *p; ++p) {
        auto c = *p;
        auto cc = reinterpret_cast<char const*>(&c);
        myfile.write(cc, sizeof c);
    }
    myfile.close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    相关资源
    最近更新 更多