2017-05-08 90 views
0

我有以下簡單的程序,從3個Unicode字符集的聯合中生成隨機Unicode字符串。D語言:如何將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

+0

'unicodechars'在很多方面都是錯誤的。你是按比例的那些東西,併爲什麼編譯。你可能想使用'〜'連接或者其他的東西。 –

+0

謹慎舉個例子嗎?順便說一句,這些按比例來自Dlang的onicode教程... – fccoelho

+0

我不知道這件事應該如何工作。我以前從來沒有使用過這部分庫,文檔也沒有解釋清楚......你讀的鏈接是什麼?但是你現在正在隨機化的字符串只是一個結構成員打印,而不是一個字符列表。 –

回答

4

這條線路是你有問題:

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是凌亂)的範圍內,那麼你得到一個串出這一點,並隨機它。

+0

優秀的亞當!它現在完美。非常感謝! – fccoelho