报告 BUG: 输出中文字符串乱码

复现代码:

func init {
  "test 666 测试".print()
}
2 个赞

谢谢反馈,这个是已知问题,网页上还不能打印汉字。

关于在线 IDE 输出字符乱码的问题:

字符串以 utf-8 方式存储, 执行 print() 的时候, 月兔会一个字节一个字节的输出 (调用 spectest.print_char()), 当遇到一个汉字的时候, 因为一个汉字的 utf-8 编码是 3 个字节, 月兔会分别调用 3 次 print_char(), 从而导致乱码。

可以考虑修改执行 wasm 模块的 js 代码 (spectest.print_char()) 来实现输出 utf-8 字符, 比如:

function print_utf8() {
  let c = 0, r = 0;

  function utf8(i) {
    if (r > 0) {
      // 10xx xxxx
      c = (i & 0b0011_1111) + (c << 6);
      r -= 1;
      if (r < 1) {
        console.log(String.fromCodePoint(c));
      }
    } else {
      // 1110 xxxx
      if ((i & 0b1111_0000) == 0b1110_0000) {
        r = 2;
        c = i & 0b0000_1111;
      }
      // 110x xxxx
      if ((i & 0b1110_0000) == 0b1100_0000) {
        r = 1;
        c = i & 0b0001_1111;
      }
    }
  }

  return function (i) {
    if (i < 128) {
      console.log(String.fromCharCode(i));
    } else {
      utf8(i);
    }
  }
}
{
  spectest: {
    print_char: print_utf8()
  }
}
1 个赞


我本地使用中文,输出也是乱码

1 个赞

system: windows 10 (WSL Ubuntu 22.04.2 LTS)
moonbit version: moon 0.1.0 (079caf9 2023-09-08)

1 个赞

谢谢反馈,我们正在实现ing


你到有没有出现如上图的报错?
我是windows 11 (WSL Ubuntu 22.04.2 LTS)
moonbit version: moon 0.1.0 (2158c2f 2023-09-14)

不过实际上也确实可以运行,只是vscode会报错,不知道是不是插件问题

1 个赞

你好,需要运行 moon check --watch

更多使用说明可以参考官方文档:

https://www.moonbitlang.cn/docs/moon-build-system-tutorial/

我也遇到这个问题,我也没管,直接删了。其他调用方式是正常的。

其实原本是整行有红色波浪线的,执行了moon check之后就只有print()有红色波浪线。
执行moon check --watch也不行。

1 个赞

谢谢反馈,私聊了解技术细节~

建议设计一个原生的解码UTF8字符和字符串的内置模块.
最好是moonbit项目原生支持非ASCII, 就是从源头把ASCII排除掉.

MoonBit每周工作动态——0401
8. 调整字符串的编码为UTF-16

不知道官方出于什么考量把字符串调整为UTF-16编码了呢?
UTF-16有字节序的,也是不定长的,貌似不是一个优秀的编码方案吧 :smiling_face:

应该是为了兼容JS和Java吧,刚好刷到一个有关的知乎问题。