如何将 UTF-16 数组转换为 UTF-8 字符串?
How to convert from UTF-16 array to UTF-8 string?
我遇到一种情况,我会收到 UTF-16 代码点(一次一个)。所以我将它们收集在一个列表中,然后将列表转换为数组。
这给我留下了 uint16[]
,但是 GLib.convert ()
需要一个字符串:
int main () {
var utf16data = new Gee.ArrayList<uint16> ();
utf16data.add ('A');
utf16data.add (0xD83C);
utf16data.add (0xDC1C);
var utf16array = utf16data.to_array ();
try {
// convert expects a string here
var s = convert (utf16array, utf16data.size * 2, "UTF-8", "UTF-16LE");
stdout.printf ("%s\n", s);
}
catch (ConvertError e) {
stderr.printf (@"error: $(e.message)\n");
}
return 0;
}
那么如何将 UTF-16 数组转换为 UTF-8 字符串?
更新:
我试着只投射数组:
int main () {
var utf16data = new Gee.ArrayList<uint16> ();
utf16data.add ('A');
utf16data.add (0xD83C);
utf16data.add (0xDC1C);
// utf16data.add (0);
var utf16array = utf16data.to_array ();
try {
size_t bytes_read;
size_t bytes_written;
var s = convert ((string) utf16array, utf16data.size * 2, "UTF-8", "UTF-16LE", out bytes_read, out bytes_written);
stdout.puts (@"bytes_read = $bytes_read\n");
stdout.puts (@"bytes_written = $bytes_written\n");
stdout.puts (@"s.length = $(s.length)\n");
// Should print "A", but the Unicode symbol is not printed
stdout.puts (@"s = $s\n");
}
catch (ConvertError e) {
stderr.printf (@"error: $(e.message)\n");
}
return 0;
}
现在至少 "A" 被写入标准输出,但 Unicode 符号没有。
bytes_read = 6
bytes_written = 3
s.length = 1
s = A
在此上下文中将数组转换为字符串是否正确?
为什么Unicode符号没有转换?
更新 2:
这是我现在确定的代码:
int main () {
var utf16data = new Gee.ArrayList<uint16> ();
utf16data.add ('A');
utf16data.add (0xD83C);
utf16data.add (0xDC1C);
// Replacement for
// utf16array = utf16data.to_array;
uint16[] utf16array = new uint16[utf16data.size];
for (int i = 0; i < utf16data.size; i++)
utf16array[i] = utf16data[i];
try {
var s = convert ((string)utf16array, utf16array.length * 2, "UTF-8", "UTF-16LE");
stdout.puts (@"$s\n");
}
catch (ConvertError e) {
stderr.puts (@"error: $(e.message)\n");
}
return 0;
}
问题出在 to_array
。它不会产生一个 uint16
数组,而是一个指向指针的数组,其值设置为 uint16
值。这是标准的盒装表示。 Gee 中似乎存在一个问题,即它没有生成正确类型的数组。如果将数组更改为:
uint16[] utf16array = {'A', 0xD83C, 0xDC1C};
它工作得很好。
我遇到一种情况,我会收到 UTF-16 代码点(一次一个)。所以我将它们收集在一个列表中,然后将列表转换为数组。
这给我留下了 uint16[]
,但是 GLib.convert ()
需要一个字符串:
int main () {
var utf16data = new Gee.ArrayList<uint16> ();
utf16data.add ('A');
utf16data.add (0xD83C);
utf16data.add (0xDC1C);
var utf16array = utf16data.to_array ();
try {
// convert expects a string here
var s = convert (utf16array, utf16data.size * 2, "UTF-8", "UTF-16LE");
stdout.printf ("%s\n", s);
}
catch (ConvertError e) {
stderr.printf (@"error: $(e.message)\n");
}
return 0;
}
那么如何将 UTF-16 数组转换为 UTF-8 字符串?
更新:
我试着只投射数组:
int main () {
var utf16data = new Gee.ArrayList<uint16> ();
utf16data.add ('A');
utf16data.add (0xD83C);
utf16data.add (0xDC1C);
// utf16data.add (0);
var utf16array = utf16data.to_array ();
try {
size_t bytes_read;
size_t bytes_written;
var s = convert ((string) utf16array, utf16data.size * 2, "UTF-8", "UTF-16LE", out bytes_read, out bytes_written);
stdout.puts (@"bytes_read = $bytes_read\n");
stdout.puts (@"bytes_written = $bytes_written\n");
stdout.puts (@"s.length = $(s.length)\n");
// Should print "A", but the Unicode symbol is not printed
stdout.puts (@"s = $s\n");
}
catch (ConvertError e) {
stderr.printf (@"error: $(e.message)\n");
}
return 0;
}
现在至少 "A" 被写入标准输出,但 Unicode 符号没有。
bytes_read = 6
bytes_written = 3
s.length = 1
s = A
在此上下文中将数组转换为字符串是否正确?
为什么Unicode符号没有转换?
更新 2:
这是我现在确定的代码:
int main () {
var utf16data = new Gee.ArrayList<uint16> ();
utf16data.add ('A');
utf16data.add (0xD83C);
utf16data.add (0xDC1C);
// Replacement for
// utf16array = utf16data.to_array;
uint16[] utf16array = new uint16[utf16data.size];
for (int i = 0; i < utf16data.size; i++)
utf16array[i] = utf16data[i];
try {
var s = convert ((string)utf16array, utf16array.length * 2, "UTF-8", "UTF-16LE");
stdout.puts (@"$s\n");
}
catch (ConvertError e) {
stderr.puts (@"error: $(e.message)\n");
}
return 0;
}
问题出在 to_array
。它不会产生一个 uint16
数组,而是一个指向指针的数组,其值设置为 uint16
值。这是标准的盒装表示。 Gee 中似乎存在一个问题,即它没有生成正确类型的数组。如果将数组更改为:
uint16[] utf16array = {'A', 0xD83C, 0xDC1C};
它工作得很好。