LINUX.ORG.RU

[D] Вывод юникодного текста посимвольно

 


0

0

Салют всем 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

Внимание, вопрос - что я сделал неправильно?
★★★★

s/строка, выводится/строка выводится/

JackYF ★★★★
() автор топика

Видимо writef требует валидной юникодной строки, а ты подсовываешь ему половинку юникодного символа (char - 1 байт, в UTF-8 кириллица - 2)

// D в глаза не видел

anonymous
()

здесь явно используется char, такой пример у меня заработал:
auto str = "Вот это русский текст. And this is english text";
writefln(str);

foreach (wchar symbol; str)
{
write(symbol, " ");
}

bik ★★
()
Ответ на: комментарий от ShprotX

tango нет для второй версии. есть еще dprogramming.ru

bik ★★
()
Ответ на: комментарий от bik

>foreach (wchar symbol; str)

ИМХО, это "хак" на основании того, что для русского текста в UTF-8 используются 2-байтный символы. ИМХО, надо или преобразовать строку к UTF32 (через toUTF32()) и использовать "foreach(dchar...)", или определять размер каждого UTF-8 символа через stride().

mky ★★★★★
()
Ответ на: комментарий от anonymous

>Видимо writef требует валидной юникодной строки, а ты подсовываешь ему половинку юникодного символа (char - 1 байт, в UTF-8 кириллица - 2)

В D char - UTF-8, wchar - UTF-16, dchar UTF-32.

JackYF ★★★★
() автор топика
Ответ на: комментарий от ShprotX

>Используй Tango

У меня только phobos в наличии.

JackYF ★★★★
() автор топика
Ответ на: комментарий от anonymous

-writef("%s ", symbol); +writef("%c ", symbol);

>Ы?

Ыгы. Шестнадцатиричные коды. Спасибо, ага ;)

JackYF ★★★★
() автор топика
Ответ на: комментарий от bik

>foreach (wchar symbol; str) >{ >write(symbol, " "); >}

Спасибо, так заработало. Судя по официальной вики, это не хак, это нормально поведение, но! Мой вариант должен работать тоже (здесь, по идее, идут дополнительные преобразования из UTF-8 в UTF-16 и обратно).

Пока буду обходиться wchar'ом, а там видно будет. Всем спасибо.

JackYF ★★★★
() автор топика
Ответ на: комментарий от anonymous

char[] str = "Привет мир";

foreach (dchar symbol; str) {
    write(symbol, " ");
} 

Я это имел в виду. А так - согласен, обычно UTF-8 рулит, редкие исключения - алгоритмы, требующие константного случайного доступа.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

есть, кстати, такой портал:

dprogramming.ru news.dprogramming.ru forum.dprogramming.ru

вот :)

jet_bird
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.