Салют всем D-программерам!
Есть Debian GNU/Linux, 2.6.25, amd64. gdc 4.1.2, локаль - en_US.UTF8
Хочу вывести строку юникодную вначале полностью, затем посимвольно:
import std.stdio;
import std.string;
import std.c.locale;
void main()
{
setlocale(LC_ALL, "");
char[] str = "Вот это русский текст. And this is english text";
writefln(str);
foreach (char symbol; str)
{
writef("%s ", symbol);
}
writefln();
}
Полностью строка, выводится замечательно, а вот посимвольно никак:
$ ./second.e
Вот это русский текст. And this is english text
Error: 4invalid UTF-8 sequence
Внимание, вопрос - что я сделал неправильно?
ИМХО, это "хак" на основании того, что для русского текста в UTF-8 используются 2-байтный символы. ИМХО, надо или преобразовать строку к UTF32 (через toUTF32()) и использовать "foreach(dchar...)", или определять размер каждого UTF-8 символа через stride().
Спасибо, так заработало. Судя по официальной вики, это не хак, это нормально поведение, но! Мой вариант должен работать тоже (здесь, по идее, идут дополнительные преобразования из UTF-8 в UTF-16 и обратно).
Пока буду обходиться wchar'ом, а там видно будет. Всем спасибо.
char[] str = "Привет мир";
foreach (dchar symbol; str) {
write(symbol, " ");
}
Я это имел в виду. А так - согласен, обычно UTF-8 рулит, редкие исключения - алгоритмы, требующие константного случайного доступа.