Преобразование текста в HTML в D

Я пытаюсь найти лучший способ кодирования текста (либо 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

2 ответа

Решение

Вы можете легко сделать строку из убайта, выполнив "" ~ b, например:

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.innerHTML, ele.innerText и т. Д.), Преобразование из нескольких различных кодировок символов, включая latin1, и выводит ascii safe html со всеми специальными и юникодными символами, правильно закодированными.

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

вроде того.

В этом случае, конечно, решение Адама работает просто отлично. (Используется тот факт, что 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);
} 

NB. text () на самом деле предназначен для обработки нескольких аргументов, но удобно коротким.

Другие вопросы по тегам