2013-09-23 50 views
1

我试图找出将文本(8位ubyte[]string)编码为HTML对应文字的最佳方式。将文本转换为HTML在D

我的建议到目前为止是使用查找表的8位字符

string[256] lutLatin1ToHTML; 
lutLatin1ToXML[0x22] = "&quot"; 
lutLatin1ToXML[0x26] = "&amp"; 
... 

在HTML中显示有使用功能

pure string toHTML(in string src, 
        ref in string[256] lut) { 
    return src.map!(a => (lut[a] ? lut[a] : new string(a))).reduce!((a, b) => a ~ b) ; 
} 
特殊意义映射

除了我几乎工作我不知道如何从'ubyte创建一个字符串? (不翻译的情况)。

我试图

writeln(new string('a')); 

但它打印垃圾,我不知道为什么。

有关HTML编码的更多详细信息,请参阅https://en.wikipedia.org/wiki/Character_entity_reference

回答

2

您可以通过执行“”〜B,例如使从UBYTE字符串最容易:

ubyte b = 65; 
string a = "" ~ b; 
writeln(a); // prints A 

顺便说一句,如果你想要做的很多HTML的东西,我dom.d和characterencodings.d可能是有用的: https://github.com/adamdruppe/misc-stuff-including-D-programming-language-web-stuff

它有一个HTML解析器,DOM操作功能类似的JavaScript(如ele.querySelector()的getElementById,ele.inner HTML,ele.innerText等),从几种不同的字符编码(包括latin1)进行转换,并输出ascii安全html,并对所有特殊和unicode字符进行正确编码。

assert(htmlEntitiesEncode("foo < bar") == "foo &lt; bar"; 

这样的东西。

+2

我应该补充说“”〜128将不起作用 - 这可能最终会抱怨无效的utf-8序列。它不会在前面,所以你可以一次构建一个字节的字符串。只要确保你添加了值b <128 - ascii - 或者注意以正确的utf8格式编码其他值。但是,如果你将所有的HTML编码在一起,那么无论如何你都会好起来的,因为这就是所有的ascii。 –

1

在这种情况下,Adam的解决方案当然很好。 (它利用了ubyte可隐式转换为char的特性,然后将其附加到字符串为别名的不可变(char)[]数组。)

通常,转换类型的安全方式是使用std.conv。

import std.stdio, std.conv; 

void main() { 
    // utf-8 
    char cc = 'a'; 
    string s1 = text(cc); 
    string s2 = to!string(cc); 
    writefln("%c %s %s", cc, s1, s2); 

    // utf-16 
    wchar wc = 'a'; 
    wstring s3 = wtext(wc); 
    wstring s4 = to!wstring(wc); 
    writefln("%c %s %s", wc, s3, s4);  

    // utf-32 
    dchar dc = 'a'; 
    dstring s5 = dtext(dc); 
    dstring s6 = to!dstring(dc); 
    writefln("%c %s %s", dc, s5, s6); 

    ubyte b = 65; 
    string a = to!string(b); 
} 

NB。 text()实际上是用来处理多个参数的,但是方便的简短。

+0

事实上,虽然要注意,string(ubyte)会给出一个类似于“65”而不是A的数字。你可以对!string(cast(char)ubyte)进行操作,或者将其强制转换为wchar/dchar, 。 –