1

ubyte[]テキスト (8 ビットまたは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-include-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

もちろん、この場合、Adam のソリューションは問題なく機能します。(これは、ubyte が暗黙的に char に変換可能であるという事実を利用しており、その後、string がエイリアスである 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 に答える