如何将std :: string写入UTF-8文本文件

时间:2010-06-10 01:29:38

标签: c++ utf-8

我只想在C ++中用文本文件写一些简单的行,但我希望它们用UTF-8编码。这样做的最简单方法是什么?

9 个答案:

答案 0 :(得分:55)

UTF-8影响std::string的唯一方法是size()length(),所有索引都以字节为单位,而不是字符。

并且,正如sbi指出的那样,递增std::string提供的迭代器将逐字节前进,而不是按字符前进,因此它实际上可以指向多字节UTF-8代码点的中间位置。标准库中没有提供UTF-8感知迭代器,但是'Net上有一些可用。

如果你还记得,你可以把UTF-8放到std::string中,把它写成文件等等都是通常的方式(我指的是你使用{{1}的方式}内没有UTF-8。

您可能希望以字节顺序标记启动文件,以便其他程序知道它是UTF-8。

答案 1 :(得分:24)

有一个很好的小型库可以使用c ++中的utf8:utfcpp

答案 2 :(得分:10)

libiconv是一个很棒的库,可以满足我们所有的编码和解码需求。

如果您使用的是Windows,则可以使用WideCharToMultiByte并指定您需要UTF8。

答案 3 :(得分:9)

  

最简单明了的方法是什么?

在C ++中使用utf8进行最直观,最简单的处理肯定是使用替换std::string 。 由于互联网仍然缺乏一个,我去实现自己的功能:

tinyutf8(编辑:现在是Github)。

这个库为std::string(或std::u32string提供了一个非常轻量级的插入式预置位,如果你愿意的话,因为你迭代代码点而不是 char S)。 Ity在快速访问和小内存消耗之间成功实现,同时非常强大。这种“无效”的强大功能UTF8序列使其(几乎完全)与ANSI(0-255)兼容。

希望这有帮助!

答案 4 :(得分:7)

如果“简单”是指ASCII,则无需进行任何编码,因为ASCII值为127或更小的字符在UTF-8中是相同的。

答案 5 :(得分:5)

std::wstring text = L"Привет";
QString qstr = QString::fromStdWString(text);
QByteArray byteArray(qstr.toUtf8());    
std::string str_std( byteArray.constData(), byteArray.length());

答案 6 :(得分:0)

我的偏好是与std :: u32string进行相互转换并在内部使用代码点,然后在使用these转换为我放在github上的迭代器写入文件时,转换为utf8。

integration-tests:
  image: my-images-repo/my-gitlab-runner-dotnet-core:latest
  stage: integration-tests  
  services:
    # add event store service
    - eventstore/eventstore:release-4.1.1-hotfix1    
  variables:
    # event store service params testing with standard ports
    EVENTSTORE_INT_TCP_PORT: "1113"
    EVENTSTORE_EXT_TCP_PORT: "1113"
    EVENTSTORE_INT_HTTP_PORT: "2113"
    EVENTSTORE_EXT_HTTP_PORT: "2113"
    EVENTSTORE_EXT_HTTP_PREFIXES: "http://*:2113/"   
  script:
    - dotnet restore --no-cache --force
    - dotnet build --configuration Release
    - dotnet vstest *IntegrationTests/bin/Release/**/*IntegrationTests.dll

答案 7 :(得分:-1)

使用Glib::ustring中的glibmm

它是唯一广泛使用的UTF-8字符串容器(AFAIK)。虽然基于字形(非字节),它具有与std::string相同的方法签名,因此端口应该是简单的搜索和替换(只需确保您的数据在将其加载到{{1}之前是有效的UTF-8 })。

答案 8 :(得分:-28)

至于UTF-8是多字符字符串,所以你会遇到一些问题,这是一个坏主意/而是使用普通的Unicode。

所以我认为最好是使用普通的ASCII字符文本和一些编码集。如果您使用超过2组不同的符号,则需要使用Unicode (语言)单一。

这是一个相当罕见的案例。在大多数情况下足够2套符号。对于这种常见情况,使用ASCII字符,而不是Unicode。

使用UTF-8等多重字符的效果只能获得中国传统,阿拉伯语或某些象形文字。这是非常罕见的情况!!!

我不认为有很多人需要这样做。所以永远不要使用UTF-8!它可以避免操纵这些字符串的强烈头痛。