[英]String conversion from UTF-8 to UTF-16 Big endian is failing (using C, C++ language)
我正在使用g_convert()glib函數將utf-8字符串轉換為utf-16大端字符串。 轉換失敗。 我們收到一條錯誤消息,提示“不支持轉換”
有人可以提供一些線索來解決這個問題。
謝謝
以下是用於從UTF-8轉換字符串的代碼段。 到UTF16 Bigendian
unsigned short *result_str;
gsize bytes_read, bytes_written;
gssize len = 0;
GError *error = NULL;
result_str = (unsigned short *)g_convert("text data", len, "UTF-16BE", "UTF-8", &bytes_read, &bytes_written, &error);
您len
為0。GLib 手冊說,對於以NULL結尾的字符串, len
必須為-1。
g_convert在封面下使用iconv。
在我使用cygwim的機器上,我可以
iconv -l
其中列出了受支持的編碼,並且UTF-16BE確實出現在列表中:
$ iconv -l | grep BE
UCS-2BE UNICODE-1-1 UNICODEBIG CSUNICODE11
UCS-4BE
UTF-16BE
UTF-32BE
James@XPL3KWK28 ~
$ iconv -f UTF-8 -t UTF16-BE
iconv: conversion to UTF16-BE unsupported
iconv: try 'iconv -l' to get the list of supported encodings
如您所見,它不支持與UTF-8之間的轉換。
您可能需要分兩個階段執行此操作,即從UTF-8到UTF-16,然后從UTF-16到UTF-16BE。
我懷疑g_convert
不支持UTF-16BE
(基於錯誤消息)。 但是,將UTF-8轉換為UTF-16BE並不容易(沒有任何表或類似的垃圾),您可以自己進行轉換。
您可能還需要檢查是否支持UTF-16
,並在需要時進行自己的字節交換。 但是我也不相信g_convert
支持UTF-16
。
看來您的系統不支持該轉換。 (此錯誤意味着iconv()返回EINVAL。)
在我的Linux系統上,它確實受到支持:
echo "Hello" | iconv --from-code UTF-16BE --to-code UTF-8
(顯然,“ Hello”不是有效的UTF-16字符串,但確實會轉換為某種形式,因此似乎支持實際的轉換)
查看“ iconv --list”中是否有UTF-16BE
在這種情況下,最簡單的解決方案可能是只使用g_utf8_to_utf16(): http ://library.gnome.org/devel/glib/stable/glib-Unicode-Manipulation.html#g-utf8-to-utf16
您可以輕松地編寫自己的byteswap未經測試的代碼:
if (G_BYTE_ORDER != G_BIG_ENDIAN) {
for (i = 0; i < len; ++i) {
result_str[i] = GUINT16_TO_BE(result_str[i]);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.