Vala:从不识别多字节字符的字节读取UTF-8字符串

时间:2017-09-02 22:19:24

标签: string encoding utf-8 vala

对于我目前正在处理的应用程序,我需要从二进制文件中读取UTF-8编码的字符串。这些字符串不是以空值终止的,而是以一个指定其长度的字节开头。

当我尝试读取这样的字符串时,所有多字节UTF-8字符都变为?。在下面找到一个示例:

public void main(string[] args) {
  File file = File.new_for_path("test.bin");
  DataInputStream instream = new DataInputStream(file.read());
  uint8[] chars = new uint8[instream.read_byte()];
  instream.read(chars);
  print(@"$((string) chars)\n");
}

当然,这是剥离的样品。有问题的实际二进制文件是加密的,这里没有反映出来。如果我将其与包含字节序列09 52 C3 AD 61 73 74 72 61 64的示例文件test.bin一起使用,或者将Ríastrad作为前缀,其字节长度为UTF-8。因此预期输出为Ríastrad,但实际输出为R?astrad

任何人都可以对这个问题有所了解,也许是一个解决方案?

1 个答案:

答案 0 :(得分:1)

您需要在代码中添加Intl.setlocale ();

public void main(string[] args) {
  Intl.setlocale ();
  File file = File.new_for_path("test.bin");
  DataInputStream instream = new DataInputStream(file.read());
  uint8[] chars = new uint8[instream.read_byte()];
  instream.read(chars);
  print(@"$((string) chars)\n");
}

print ()的默认语言环境是C语言环境,即US ASCII。 US ASCII字符范围之外的任何字符都显示为?。使用Intl.setlocale ();将语言环境设置为与运行程序的计算机相同。