我只想在C ++中用文本文件写一些简单的行,但我希望它们用UTF-8编码。这样做的最简单方法是什么?
答案 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!它可以避免操纵这些字符串的强烈头痛。