[资料] 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
聊天不打标点习惯了......
Global site tag (gtag.js) - Google Analytics