D语言:如何将Unicode字符打印到控制台?

D语言:如何将Unicode字符打印到控制台?,unicode,d,Unicode,D,我有以下简单的程序从3个Unicode字符集的并集生成一个随机Unicode字符串 #!/usr/bin/env rdmd import std.uni; import std.random : randomSample; import std.stdio; import std.conv; /** * Random salt generator */ dstring get_salt(uint s) { auto unicodechars = unicode("Cyrillic")

我有以下简单的程序从3个Unicode字符集的并集生成一个随机Unicode字符串

#!/usr/bin/env rdmd
import std.uni;
import std.random : randomSample;
import std.stdio;
import std.conv;

/**
*  Random salt generator
*/
dstring get_salt(uint s)
{
    auto unicodechars = unicode("Cyrillic") | unicode("Armenian") | unicode("Telugu");
    dstring unichars =  to!dstring(unicodechars);

    return to!dstring(randomSample(unichars, s));
}

void main()
{
    writeln("Random salt:");
    writeln(get_salt(32));
}
但是,writeln的输出是:

$ ./teste.d
Random salt:
rw13  13437 78580112 104 3914645

这些数字是多少?Unicode代码点?如何打印实际字符?我在Ubuntu Linux上,语言环境设置为UTF-8

这一行是您遇到的问题:

dstring unichars =  to!dstring(unicodechars);
它将
CodepointSet
对象
unicode
转换为字符串,而不是它包含的字符。集合具有名称和字符边界,但不具有字符本身。它采取了以下行动:

InversionList!(GcPolicy)(CowArray!(GcPolicy)([1024, 1157, 1159, 1320, 1329, 1367, 1369, 1376, 1377, 1416, 1418, 1419, 1423, 1424, 3073, 3076, 3077, 3085, 3086, 3089, 3090, 3113, 3114, 3124, 3125, 3130, 3133, 3141, 3142, 3145, 3146, 3150, 3157, 3159, 3160, 3162, 3168, 3172, 3174, 3184, 3192, 3200, 7467, 7468, 7544, 7545, 11744, 11776, 42560, 42648, 42655, 42656, 64275, 64280, 5]))
然后从那根绳子上随机抽出一些字符!相反,您希望:

dstring unichars =  to!dstring(unicodechars.byCodepoint);

在该对象上调用
byCodepoint
方法将产生范围内的实际字符(代码点,unicode很乱),然后从中获得一个字符串并将其随机化。

这一行是您遇到的问题:

dstring unichars =  to!dstring(unicodechars);
它将
CodepointSet
对象
unicode
转换为字符串,而不是它包含的字符。集合具有名称和字符边界,但不具有字符本身。它采取了以下行动:

InversionList!(GcPolicy)(CowArray!(GcPolicy)([1024, 1157, 1159, 1320, 1329, 1367, 1369, 1376, 1377, 1416, 1418, 1419, 1423, 1424, 3073, 3076, 3077, 3085, 3086, 3089, 3090, 3113, 3114, 3124, 3125, 3130, 3133, 3141, 3142, 3145, 3146, 3150, 3157, 3159, 3160, 3162, 3168, 3172, 3174, 3184, 3192, 3200, 7467, 7468, 7544, 7545, 11744, 11776, 42560, 42648, 42655, 42656, 64275, 64280, 5]))
然后从那根绳子上随机抽出一些字符!相反,您希望:

dstring unichars =  to!dstring(unicodechars.byCodepoint);

对该对象调用
byCodepoint
方法将产生范围内的实际字符(好吧,代码点,unicode很乱),然后从中得到一个字符串并将其随机化。

unicodechars在很多方面都是错误的。您正在按位对这些内容进行oring,并且知道为什么会编译这些内容。您可能想使用
~
串联或其他方法。请给出一个简短的示例?顺便说一句,这些按位OR来自于关于OnCode的Dlang教程……我不知道这个东西应该如何工作。我以前从未使用过库的这一部分,文档也没有很好地解释它。。。你在读什么链接?但是你现在随机化的字符串只是一个结构成员打印,而不是一个字符列表。哦,我明白了,它根本不返回字符串,它返回一个神奇的集合对象。。。好的,我现在明白了,写一个答案,
unicodechars
在很多方面都是错误的。您正在按位对这些内容进行oring,并且知道为什么会编译这些内容。您可能想使用
~
串联或其他方法。请给出一个简短的示例?顺便说一句,这些按位OR来自于关于OnCode的Dlang教程……我不知道这个东西应该如何工作。我以前从未使用过库的这一部分,文档也没有很好地解释它。。。你在读什么链接?但是你现在随机化的字符串只是一个结构成员打印,而不是一个字符列表。哦,我明白了,它根本不返回字符串,它返回一个神奇的集合对象。。。好吧,我现在写了一个答案,优秀的亚当!它现在工作得很好。谢谢!优秀的亚当!它现在工作得很好。谢谢!