String Vala:从无法识别多字节字符的字节中读取UTF-8字符串

String Vala:从无法识别多字节字符的字节中读取UTF-8字符串,string,encoding,utf-8,vala,String,Encoding,Utf 8,Vala,对于我目前正在处理的应用程序,我需要从二进制文件中读取UTF-8编码的字符串。这些字符串不是以null结尾的,而是以指定其长度的字节作为前缀 当我试图读入这样一个字符串时,所有多字节UTF-8字符都会变成?。下面是一个示例: public void main(string[] args) { File file = File.new_for_path("test.bin"); DataInputStream instream = new DataInputStream(file.read

对于我目前正在处理的应用程序,我需要从二进制文件中读取UTF-8编码的字符串。这些字符串不是以null结尾的,而是以指定其长度的字节作为前缀

当我试图读入这样一个字符串时,所有多字节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");
}
当然,这是一个剥离样本。所讨论的实际二进制文件是加密的,这里没有反映出来。如果我将其用于一个示例文件test.bin,该文件包含字节序列
0952c3ad617374726164
,或
Ríastrad
,其字节长度以UTF-8开头。因此,预期输出是
Ríastrad
,但实际输出是
R?astrad


有没有人能解释一下这个问题,也许还有一个解决方案?

您需要添加
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。美国ASCII字符范围之外的任何字符都显示为
。使用
Intl.setlocale()将区域设置设置为与运行程序的计算机相同。

非常感谢您——这正是我所需要的!我完全专注于事物的弦的一面,而完全忽略了另一面,在这种情况下,更重要的一面。我不会再犯错误了!