为什么 UChar* 不支持此 ICU 转换?

发布于 2024-11-06 15:33:08 字数 875 浏览 4 评论 0原文

从 UTF-8 转换为 ISO-8859-6 时,此代码不起作用:

UnicodeString ustr = UnicodeString::fromUTF8(StringPiece(input));

const UChar* source = ustr.getBuffer();

char target[1000];
UErrorCode status = U_ZERO_ERROR;
UConverter *conv;
int32_t     len;

// set up the converter
conv = ucnv_open("iso-8859-6", &status);
assert(U_SUCCESS(status));

// convert 
len = ucnv_fromUChars(conv, target, 100, source, -1, &status);
assert(U_SUCCESS(status));

// close the converter
ucnv_close(conv);

string s(target);
return s;

images: (1,2)

但是,当用硬编码的 UChar[] 替换 UChar* 时,效果很好!! 图片:(3)

When converting from UTF-8 to ISO-8859-6 this code didn't work:

UnicodeString ustr = UnicodeString::fromUTF8(StringPiece(input));

const UChar* source = ustr.getBuffer();

char target[1000];
UErrorCode status = U_ZERO_ERROR;
UConverter *conv;
int32_t     len;

// set up the converter
conv = ucnv_open("iso-8859-6", &status);
assert(U_SUCCESS(status));

// convert 
len = ucnv_fromUChars(conv, target, 100, source, -1, &status);
assert(U_SUCCESS(status));

// close the converter
ucnv_close(conv);

string s(target);
return s;

images: (1,2)

However when replacing UChar* with a hard-coded UChar[] it works well!!
image : (3)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

々眼睛长脚气 2024-11-13 15:33:08

看起来你正在采取困难的方法。这个怎么样:

static char const* const cp = "iso-8859-6";
UnicodeString ustr = UnicodeString::fromUTF8(StringPiece(input));
std::vector<char> buf(ustr.length() + 1);
std::vector<char>::size_type len = ustr.extract(0, ustr.length(), &buf[0], buf.size(), cp);
if (len >= buf.size())
{
    buf.resize(len + 1);
    len = ustr.extract(0, ustr.length(), &buf[0], buf.size(), cp);
}
std::string ret;
if (len)
    ret.assign(buf.begin(), buf.begin() + len));
return ret;

It looks like you're taking the difficult approach. How about this:

static char const* const cp = "iso-8859-6";
UnicodeString ustr = UnicodeString::fromUTF8(StringPiece(input));
std::vector<char> buf(ustr.length() + 1);
std::vector<char>::size_type len = ustr.extract(0, ustr.length(), &buf[0], buf.size(), cp);
if (len >= buf.size())
{
    buf.resize(len + 1);
    len = ustr.extract(0, ustr.length(), &buf[0], buf.size(), cp);
}
std::string ret;
if (len)
    ret.assign(buf.begin(), buf.begin() + len));
return ret;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文