【问题标题】:Vala: Reading UTF-8 string from bytes not recognizing multibyte charactersVala:从无法识别多字节字符的字节中读取 UTF-8 字符串
【发布时间】:2025-12-17 09:20:07
【问题描述】:

对于我目前正在处理的应用程序,我需要从二进制文件中读取 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 64Ríastrad 的示例文件test.bin 一起使用,其字节长度以UTF-8 开头。因此,预期输出为Ríastrad,但实际输出为R?astrad

是否有人能够阐明这个问题,或许还有解决方案?

【问题讨论】:

    标签: string encoding utf-8 vala


    【解决方案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 语言环境,即美国 ASCII。 US ASCII 字符范围之外的任何字符都显示为?。使用Intl.setlocale (); 将语言环境设置为与运行程序的机器相同。

    【讨论】:

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