C++ 将 UTF-8 字符串转换为 ICU 的 StringPiece
C++ Converting an UTF-8 string to ICU's StringPiece
第一次在这里发帖,如果我的标题/格式/标签不符合预期,请提前致歉。
我正在尝试在 c++ windows 控制台应用程序中创建一个函数,它将从 std::wstring
用户输入中删除变音符号。为此,我使用了在 this question 的帮助下创建的代码,并将我的 wstring 转换为 UTF-8 字符串,如下所示:
std::string test= wstring_to_utf8 (input);
std::string wstring_to_utf8 (const std::wstring& str){
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.to_bytes(str);
}
std::string output= desaxUTF8(test);
desaxUTF8(...) 为:
#include <unicode/utypes.h>
#include <unicode/unistr.h>
#include <unicode/ustream.h>
#include <unicode/translit.h>
#include <unicode/stringpiece.h>
std::string desaxUTF8(const std::string& str) {
StringPiece s(str);
UnicodeString source = UnicodeString::fromUTF8(s);
//...
return result;
}
这是我 运行 遇到的问题。 StringPiece s
没有从 string str
正确接收值,而是设置为不正确的值。
但如果我用硬编码值替换 StringPiece s(str);
,比如 StringPiece s("abcš");
,它工作得很好。
使用 VS2015 调试器,用户输入 abcš
的 StringPiece s
上的值不正确 0x0028cdc0 "H\t„"
,而硬编码 abcš
的值是正确的 0x00b483d4 "abcš"
我做错了什么,解决这个问题的最佳方法是什么?我已经尝试过 this thread.
推荐的解决方案
过去两天我一直在努力寻找解决方案,但无济于事,因此,我们将不胜感激。
提前谢谢你。
Post 回答编辑:对于任何感兴趣的人,这里是工作代码,非常感谢 Steven R. Loomis 使它成为现实;
std::wstring Menu::removeDiacritis(const std::wstring &input) {
UnicodeString source(FALSE, input.data(), input.length());
UErrorCode status = U_ZERO_ERROR;
Transliterator *accentsConverter = Transliterator::createInstance(
"NFD; [:M:] Remove; NFC", UTRANS_FORWARD, status);
accentsConverter->transliterate(source);
std::wstring output(source.getBuffer(), source.length());
return output;
}
@NuSkooler(嗨!)当然是现场。无论如何,请尝试在 UnicodeString
和 std::wstring
之间进行转换 iff std::wstring
实际上是 UTF-16。 (未测试)
std::wstring doSomething(const std::wstring &input) {
#if(sizeof(wchar_t) != sizeof(UChar))
#error no idea what (typically underspecified) wchar_t actually is.
#else
// source is a read-only alias to the input data
const UnicodeString source(FALSE, input.data(), input.length());
// DO SOMETHING with the data
UnicodeString target = SOME_ACTUAL_FUNCTION(source); // <<<< Put your actual code here
// construct an output wstring
std::wstring output(target.getBuffer(), target.length());
// return it
return output;
#endif
}
第一次在这里发帖,如果我的标题/格式/标签不符合预期,请提前致歉。
我正在尝试在 c++ windows 控制台应用程序中创建一个函数,它将从 std::wstring
用户输入中删除变音符号。为此,我使用了在 this question 的帮助下创建的代码,并将我的 wstring 转换为 UTF-8 字符串,如下所示:
std::string test= wstring_to_utf8 (input);
std::string wstring_to_utf8 (const std::wstring& str){
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.to_bytes(str);
}
std::string output= desaxUTF8(test);
desaxUTF8(...) 为:
#include <unicode/utypes.h>
#include <unicode/unistr.h>
#include <unicode/ustream.h>
#include <unicode/translit.h>
#include <unicode/stringpiece.h>
std::string desaxUTF8(const std::string& str) {
StringPiece s(str);
UnicodeString source = UnicodeString::fromUTF8(s);
//...
return result;
}
这是我 运行 遇到的问题。 StringPiece s
没有从 string str
正确接收值,而是设置为不正确的值。
但如果我用硬编码值替换 StringPiece s(str);
,比如 StringPiece s("abcš");
,它工作得很好。
使用 VS2015 调试器,用户输入 abcš
的 StringPiece s
上的值不正确 0x0028cdc0 "H\t„"
,而硬编码 abcš
的值是正确的 0x00b483d4 "abcš"
我做错了什么,解决这个问题的最佳方法是什么?我已经尝试过 this thread.
推荐的解决方案过去两天我一直在努力寻找解决方案,但无济于事,因此,我们将不胜感激。
提前谢谢你。
Post 回答编辑:对于任何感兴趣的人,这里是工作代码,非常感谢 Steven R. Loomis 使它成为现实;
std::wstring Menu::removeDiacritis(const std::wstring &input) {
UnicodeString source(FALSE, input.data(), input.length());
UErrorCode status = U_ZERO_ERROR;
Transliterator *accentsConverter = Transliterator::createInstance(
"NFD; [:M:] Remove; NFC", UTRANS_FORWARD, status);
accentsConverter->transliterate(source);
std::wstring output(source.getBuffer(), source.length());
return output;
}
@NuSkooler(嗨!)当然是现场。无论如何,请尝试在 UnicodeString
和 std::wstring
之间进行转换 iff std::wstring
实际上是 UTF-16。 (未测试)
std::wstring doSomething(const std::wstring &input) {
#if(sizeof(wchar_t) != sizeof(UChar))
#error no idea what (typically underspecified) wchar_t actually is.
#else
// source is a read-only alias to the input data
const UnicodeString source(FALSE, input.data(), input.length());
// DO SOMETHING with the data
UnicodeString target = SOME_ACTUAL_FUNCTION(source); // <<<< Put your actual code here
// construct an output wstring
std::wstring output(target.getBuffer(), target.length());
// return it
return output;
#endif
}