复现代码:
func init {
"test 666 测试".print()
}
复现代码:
func init {
"test 666 测试".print()
}
谢谢反馈,这个是已知问题,网页上还不能打印汉字。
关于在线 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()
}
}
system: windows 10 (WSL Ubuntu 22.04.2 LTS)
moonbit version: moon 0.1.0 (079caf9 2023-09-08)
谢谢反馈,我们正在实现ing
不过实际上也确实可以运行,只是vscode会报错,不知道是不是插件问题
你好,需要运行 moon check --watch
更多使用说明可以参考官方文档:
我也遇到这个问题,我也没管,直接删了。其他调用方式是正常的。
其实原本是整行有红色波浪线的,执行了moon check之后就只有print()有红色波浪线。
执行moon check --watch也不行。
谢谢反馈,私聊了解技术细节~
建议设计一个原生的解码UTF8字符和字符串的内置模块.
最好是moonbit项目原生支持非ASCII, 就是从源头把ASCII排除掉.
MoonBit每周工作动态——0401
8. 调整字符串的编码为UTF-16
不知道官方出于什么考量把字符串调整为UTF-16编码了呢?
UTF-16有字节序的,也是不定长的,貌似不是一个优秀的编码方案吧
应该是为了兼容JS和Java吧,刚好刷到一个有关的知乎问题。
https://www.zhihu.com/question/652839772/answer/3472123259?utm_psn=1764941741592010752