Преобразование текста в HTML в D
Я пытаюсь найти лучший способ кодирования текста (либо 8-битный ubyte[]
или же string
) к своему HTML-аналогу.
Мое предложение до сих пор состоит в том, чтобы использовать таблицу соответствия для сопоставления 8-битных символов
string[256] lutLatin1ToHTML;
lutLatin1ToXML[0x22] = """;
lutLatin1ToXML[0x26] = "&";
...
в 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 < 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 () на самом деле предназначен для обработки нескольких аргументов, но удобно коротким.