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

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

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

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

JackYF ★★★★ ()

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

D не нужен, есть Alef из Plan 9. C нужно заменять на Alef, UNIX на Plan 9.

anonymous ()

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

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

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

anonymous ()

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

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

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

bik ★★ ()

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

- Используй Tango
- на форуме dsource.org больше вероятность получить ответ

ShprotX ()

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

>foreach (wchar symbol; str)

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

mky ★★★★★ ()

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

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

Ы?

anonymous ()
Ответ на: Re: [D] Вывод юникодного текста посимвольно от anonymous

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

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

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

JackYF ★★★★ ()

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

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

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

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

JackYF ★★★★ ()
Ответ на: Re: [D] Вывод юникодного текста посимвольно от anonymous

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

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

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

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

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