[资料] d语言中文乱码解决方法
非仙
2012-04-28
根据现有资料解决方案如下 import core.stdc.wchar_,core.stdc.locale; extern(C) int setlocale(int, char*); static this() { fwide(core.stdc.stdio.stdout, 1); setlocale(0, cast(char*)"china"); }
但是 这段代码对如下语句还是无效 writeln("1个"c); writeln("1个");
调试后发现执行到如下代码
void writeln(T...)(T args) if (T.length == 1 && is(typeof(args[0]) : const(char)[]) && !is(typeof(args[0]) == enum)) { //stdout.write(args, '\n'); enforce(fprintf(.stdout.p.handle, "%.*s\n", cast(int) args[0].length, args[0].ptr) >= 0); }
fprintf 是C函数 原意是优化输出 stdout.write是遍历每一个字符输出的 效率比较慢 而一般情况下 writeln都只有一个字符串..这里直接整体输出加快速度 而 "1个"c 这样的字符串在D语言中是UTF8 于是非英文语言就悲剧了........ 解决方案: 1 可以加入转化编码的语句 2 直接使用writeln("1个"w);或者 writeln("1个"d); 3 偷懒一下 直接改成如下 但是损失了部分效率 不过问题不大 void writeln(T...)(T args) if (T.length == 1 && is(typeof(args[0]) : const(char)[]) && !is(typeof(args[0]) == enum)) { stdout.write(args, '\n'); /* enforce(fprintf(.stdout.p.handle, "%.*s\n", cast(int) args[0].length, args[0].ptr) >= 0); */ }
最好还是直接在程序中全部使用wstring 在windows中 系统使用的是UTF-16 和GBK windows 对UTF-8不友好 输出和调用api需要每次都转化 而GBK在D语言中直接不支持 但是在web和linux上 UTF-8 是标准 D语言拥有比较大的优势
|
|
非仙
2012-04-28
修改后测试代码: writeln("1个"c); writeln("1个"w); writeln("2个"c,"2个"c); writeln("2个"c,"2个"w); writeln("2个"w,"2个"w); writeln("1个"d); writeln("3个"d,"3个"c, "3个"w); writeln("2个"d,"2个"d); writeln("2个"d,"2个"c); writeln("2个"d,"2个"w);
|
|
hqs7636
2012-04-28
标点符号不算钱是吧
|
|
非仙
2012-04-28
聊天不打标点习惯了......
|