LINUX.ORG.RU

wchar_t | ICU

// можно конечно и ручками, но это у тех у кого NIH чешется

shty ★★★★★
()

Прочитать маны, начать с wchar. А лучше glib.

x3al ★★★★★
()
Ответ на: комментарий от post-factum

А ничего лучше и не придумали для посимвольной работы с текстом. С юникодом намучаешься: что-то однобайтное, что-то двухбайтное, что-то вообще четырехбайтное! Нафиг этот график? Тем паче, что кириллица с латинницей отлично в 256 символов влезают, еще и места до фига остается.

Eddy_Em ☆☆☆☆☆
()

for(;*buf;*buf++) printf(«%c\n»,*buf);

ты все правильно написал?

anonymous
()

спасибо за wchar не знал, этого. (P.S. у меня UTF8.)

sadavod
() автор топика
Ответ на: комментарий от Eddy_Em

Да ну нафиг эти ваши кириллицы. Лучше юзать все символы выше 127го в своих целях, если у каких-то негров с кириллицами всё отваливается, то это проблемы негров. Яркий пример: современный (не дебианобубунтовое говно мамонта) dash.

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

Тем паче, что кириллица с латинницей отлично в 256 символов влезают, еще и места до фига остается

Так я только за!!! но как с этим работать если строка char *buf = «0123АБВRRRЕ»; уже компилится как UTF

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

как с этим работать если строка char *buf = «0123АБВRRRЕ»; уже компилится как UTF

4.2: в текстовом редакторе не надо выставлять UTF8!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от sadavod
cat 1.c
#include <stdio.h>
main(){
	char *buf = "0123АБВRRRЕ";
	for(;*buf;buf++) printf("%c\n",*buf);
}

gcc 1.c 

./a.out
0
1
2
3
А
Б
В
R
R
R
Е
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

С юникодом намучаешься: что-то однобайтное, что-то двухбайтное, что-то вообще четырехбайтное!

Ну сколько можно мешать мух с котлетами? Ты путаешь юникод с utf-8. Utf-8 - траспортная кодировка. Для работы с текстом внутри программы обычно используется какое-нибудь представление юникода с фиксированным размером символа.

Тем паче, что кириллица с латинницей отлично в 256 символов влезают, еще и места до фига остается.

Если бы алфавиты всех языков мира (да или хотя бы европы) вписывались в эту самую кириллицу и латинницу...

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

Если бы алфавиты всех языков мира (да или хотя бы европы) вписывались в эту самую кириллицу и латинницу...

Когда мне нужно выводить сообщения на всяких языках, я пользуюсь gettext'ом и не придумываю велосипедов. Если нужно простую консольную программку на русском сделать — только КОИ8, естественно. Все равно у большинства на компьютерах КОИ8.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от staseg

Для работы с текстом внутри программы обычно используется какое-нибудь представление юникода с фиксированным размером символа.

А ты путаешь кодпойнты с глифами. Да, обычно используется предстваление, где кодпойнты фиксированной длинны (например, wchar_t), но это не значит что один глиф определяется одним кодпойнтом. Поэтому, перед работой с произвольной юникодовской строкой ее необходимо сначала нормализовать.

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

У нас софт был, есть и будет только на КОИ8.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ttnl

Война не закончилась, пока остался жив хотя бы один солдат

давайте тогда найдем их всех и закопаем, во славу Unicode :)

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

Когда мне нужно выводить сообщения на всяких языках, я пользуюсь gettext'ом

Так тут же не вывод текста, а посимвольная работа с ним. gettext ничерта не поможет.

x3al ★★★★★
()
#include <stdio.h>

int main(int argc, char const *argv[]){
	char *buf = "123АБВ_ABC";
	for(;*buf;buf++) 
		putchar(*buf);
	putchar('\n');
	return 0;
}
» crusty » [c]: gcc -Wall -Werror test.c -o test
» crusty » [c]: ./test 
123АБВ_ABC
z00ke
()
Ответ на: комментарий от z00ke

Терминал умный. Ты в него поток байтов, которые в уникоде читаются выдал, он и написал их. Теперь разбавь из символами перевода строки — он тебе хрень и напишет.

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

Это шутка была. Неудачная)

Deleted
()
Ответ на: комментарий от z00ke
artifth@whiteblade:~/src$ cat test.c
#include <stdio.h>

int main(int argc, char const *argv[]){
  char *buf = "123АБВ_ABC";
  for(;*buf;buf++){
    putchar(*buf);
    putchar('\n');
  }
  putchar('\n');
  return 0;
}
artifth@whiteblade:~/src$ ./test
1
2
3

�

�

�
_
A
B
C

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

плохо проверял.


fantom@home:/tmp$ cat ./ttt.c 
#include <stdio.h>

int main(int argc, char const *argv[]){
	char *buf = "123АБВ_ABC";
	for(;*buf;buf++) 
	{
		putchar(*buf);
		putchar('\n');
	}
	putchar('\n');
	return 0;
}

fantom@home:/tmp$ gcc -Wall -Werror ttt.c -o ttt
fantom@home:/tmp$ ./ttt 
1
2
3

�

�

�
_
A
B
C

fantom@home:/tmp$ echo $LANG
en_US.UTF-8

Deleted
()
Ответ на: комментарий от x3al

Для посимвольной работы — только однобайтная локаль.

Eddy_Em ☆☆☆☆☆
()

1. Расстреливать за строки не-ASCII в исходниках
2. Расстреливать за %c в программах, рассчитанных на многоязычие
3. Кто использует КОИ-8 в 2012 - ССЗБ. Я б даже поленился поддерживать толком этих извращенцев - во всяком случае, если речь идет о прогах с графическим или веб интерфейсом.
4. wchar_t не годится для UTF-8
5. Использовать glib или что-нибудь в этом духе для UTF-8.

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

+0.5. Возможно. Или очень осторожно

svu ★★★★★
()

1. Установить локаль.

2. Найти тут ошибку:

for(;*buf;*buf++) printf("%c\n",*buf);

andreyu ★★★★★
()
Последнее исправление: andreyu (всего исправлений: 1)

у меня получилось, может кому будет полезным

    if (setlocale(LC_CTYPE, "") == 0) {
          fprintf(stderr, "Can't set the specified locale! Check LANG, LC_CTYPE, LC_ALL.\n");
          return 1;
    }

    #define SZ 20
    wchar_t wchar_text[SZ] = L"у попа была собака";
    wchar_t buf2[SZ+1] = L"";
    swprintf(buf2, SZ+1, L"%-20ls", wchar_text);
    printf("|%ls|\n", buf2);
    for(i = 0; i < SZ; i++) printf("%lc\n",buf2[i]);

sadavod
() автор топика
Ответ на: комментарий от svu

1. ++ (хоть самого и подмывает постоянно комментарии на русском делать)
2. ++ (если языков более двух)
3. — (УМВР, в т.ч. и веб-морды, правда, GUI через gettext)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Как мне добиться такого, как у тебя? Не общими фразами, а «пойди туда, сделай то».

пы. сы. оказывается, таких неграмотных, как я, полно) я все стеснялся это спросить. на ibm developer works есть отличная тлдр статья про юникод и вчар, но я ниасилил.

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

3. Поэтому и «ССЗБ», а не «расстреливать». Хозяин - барин. Но совершенно пустая трата времени ИМНСХО.

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

Плюсик в карму, но выглядит уродски. Это уже жалоба о мамонтооговневшему Си, скорее. А что поделать, на микроконтроллерах кириллица нафиг не нужна)

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