1

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

到目前为止,我的建议是使用查找表来映射 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

4

2 回答 2

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 解析器,类似于 javascript 的 dom 操作函数(例如 ele.querySelector()、getElementById、ele.innerHTML、ele.innerText 等),从几种不同的字符编码转换,包括 latin1,并输出 ascii 安全 html所有特殊字符和 unicode 字符均已正确编码。

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

类似的东西。

于 2013-09-23T21:41:15.067 回答
1

在这种情况下,亚当的解决方案当然可以正常工作。(它利用了 ubyte 可以隐式转换为 char 的事实,然后将其附加到字符串是别名的 immutable(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);
} 

注意。text() 实际上是用于处理多个参数,但很方便。

于 2013-09-24T14:53:19.993 回答