The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Unicode C/C++ programming"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Unicode C/C++ programming"
Сообщение от Александр emailИскать по авторуВ закладки(??) on 04-Дек-04, 09:53  (MSK)
Может кто-нибудь подсказать документацию, в которой было бы описано что нужно делать (на примерах), чтобы программа работала с Unicode?

Насколько я понял, для Unicode был создан тип данных wchar_t, однако, насколько я опять же понял, этот тип данных жёстко двухбайтовый - что, вроде как не очень подходит для программ.

Есть и другой вопрос - почему-то ни в одной библиотеке, которая в Unicode работает, я не увидел wchar_t - бывает или int (??) или обычный char (например, снизу функция из iconv/extra/) - объясните, пожалуйста - что к чему...

Заранее благодарен.

------------------------------
/*
* This C function converts an entire string from one encoding to another,
* using iconv. Easier to use than iconv() itself, and supports autodetect
* encodings on input.
*
*   int iconv_string (const char* tocode, const char* fromcode,
*                     const char* start, const char* end,
*                     char** resultp, size_t* lengthp)
*
* Converts a memory region given in encoding FROMCODE to a new memory
* region in encoding TOCODE. FROMCODE and TOCODE are as for iconv_open(3),
* except that FROMCODE may be one of the values
*    "autodetect_utf8"          supports ISO-8859-1 and UTF-8
*    "autodetect_jp"            supports EUC-JP, ISO-2022-JP-2 and SHIFT_JIS
*    "autodetect_kr"            supports EUC-KR and ISO-2022-KR
* The input is in the memory region between start (inclusive) and end
* (exclusive). If resultp is not NULL, the output string is stored in
* *resultp; malloc/realloc is used to allocate the result.
*
* This function does not treat zero characters specially.
*
* Return value: 0 if successful, otherwise -1 and errno set. Particular
* errno values: EILSEQ and ENOMEM.
*
* Example:
*   const char* s = ...;
*   char* result = NULL;
*   if (iconv_string("UCS-4-INTERNAL", "autodetect_utf8",
*                    s, s+strlen(s)+1, &result, NULL) < 0)
*     perror("iconv_string");
*
*/
------------------------------

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Unicode C/C++ programming"
Сообщение от Александр emailИскать по авторуВ закладки(??) on 05-Дек-04, 14:21  (MSK)
Видимо, никто не знает... Или очень лениво... =)

Если кого ещё будет интересовать, с этой темой удалось более-менее разобраться на этих форумах:

http://forum.sources.ru/index.php?showtopic=74839&unread=1&st=0

http://www.linux.org.ru/profile/xlex/view-message.jsp?msgid=727734&back=group.jsp%3Fgroup%3D4066

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Unicode C/C++ programming"
Сообщение от Аноним emailИскать по авторуВ закладки on 06-Дек-04, 18:06  (MSK)
>Видимо, никто не знает... Или очень лениво... =)
>
>Если кого ещё будет интересовать, с этой темой удалось более-менее разобраться на
>этих форумах:
>
>http://forum.sources.ru/index.php?showtopic=74839&unread=1&st=0
>
>http://www.linux.org.ru/profile/xlex/view-message.jsp?msgid=727734&back=group.jsp%3Fgroup%3D4066

Спасибо за ссылки.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Unicode C/C++ programming"
Сообщение от Александр emailИскать по авторуВ закладки(??) on 07-Дек-04, 18:31  (MSK)
>Спасибо за ссылки.

Наздоровье!

Ещё немного (в потверждение давней мысли о том, что стандарты читать полезно) - взято отсюда http://www.unicode.org/versions/bookmarks.html:
"The Unicode Standard provides three distinct encoding forms for Unicode characters, using 8-bit, 16bit, and 32-bit units. These are correspondingly named UTF-8, UTF-16, and UTF-32."

Блин, найдись эта фраза мне раньше, сэкономило бы мне дня два чистого времени...

Всем удачи, надеюсь кому-то поможет! =)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Unicode C/C++ programming"
Сообщение от Александр emailИскать по авторуВ закладки(??) on 07-Дек-04, 20:37  (MSK)
Теорию понял, возникли некоторые проблемы с практикой, так что снова здравствуйте... =)

Написал простенькую программу, которая берёт utf-8 файл и посредством тупого копирования переписываёт его содержимое в другой файл (копируя по одному символу).

Проблема в том, что почему-то, неизменно, в конец файла добавляемся некоторый символ '\377', на который приходится русская буква "я"  (все остальные символы - в порядке).

Подскажите, пожалуйста, в чём проблема.

Листинг:
/* Header files */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void) {

FILE *testfile_in, *testfile_out;
unsigned char ch1 = NULL, ch2 = NULL;

printf("sizeof ch1 - %li bytes\n", sizeof ch1);
printf("sizeof ch2 - %li bytes\n", sizeof ch2);

testfile_in = fopen("test_file.in", "r");
testfile_out = fopen("test_file.out", "w");

if (testfile_in == NULL) {
printf("Input file open error.\n");
return 0;
}/* if */

if (testfile_out == NULL) {
printf("Output file open/creation error.\n");
return 0;
}/* if */

while (!feof(testfile_in)) {
ch1 = getc(testfile_in);
ch2 = ch1; //make copy
putc(ch2, testfile_out); //write down copy
}/* while */

fclose(testfile_in);
fclose(testfile_out);

return 0;
}/* main */

Заранее спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Unicode C/C++ programming"
Сообщение от gyn61 Искать по авторуВ закладки(ok) on 07-Дек-04, 21:23  (MSK)
Вместо

while (!feof(testfile_in)) {
ch1 = getc(testfile_in);
ch2 = ch1; //make copy
putc(ch2, testfile_out); //write down copy
}/* while */

нужно

while (ch1 = getc(testfile_in), !feof(testfile_in)) {
ch2 = ch1; //make copy
putc(ch2, testfile_out); //write down copy
}/* while */

или

while ((ch1 = getc(testfile_in)) != EOF) {
ch2 = ch1; //make copy
putc(ch2, testfile_out); //write down copy
}/* while */

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Unicode C/C++ programming"
Сообщение от Александр emailИскать по авторуВ закладки(??) on 07-Дек-04, 21:37  (MSK)
Спасибо!

Первый (исправленный) вариант помог (второй почему-то не работает с UTF8 - хотя так я написал в самом начале).

А можно объяснить в чём была ошибка? Захват не своего участка памяти?

Заранее спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Unicode C/C++ programming"
Сообщение от DeadMustdie emailИскать по авторуВ закладки(??) on 07-Дек-04, 21:59  (MSK)
>А можно объяснить в чём была ошибка? Захват не своего участка памяти?

Да нет. Просто EOF обнаруживается не до вызова getc(), а в процессе
оного. То бишь результат нужно проверять на EOF. Вот оный EOF
(точнее, его char-останок) в файл и дописывался.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Unicode C/C++ programming"
Сообщение от Александр emailИскать по авторуВ закладки(??) on 07-Дек-04, 22:20  (MSK)
>>А можно объяснить в чём была ошибка? Захват не своего участка памяти?
>
>Да нет. Просто EOF обнаруживается не до вызова getc(), а в процессе
>
>оного. То бишь результат нужно проверять на EOF. Вот оный EOF
>(точнее, его char-останок) в файл и дописывался.

Понятно. Большое спасибо!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Unicode C/C++ programming"
Сообщение от dimus emailИскать по авторуВ закладки(??) on 09-Дек-04, 14:33  (MSK)
Лучше не заниматься посимвольным копированием. Используй fread() и fwrite() или read() и write() и буфер побольше. Работает гораздо быстрее и никаких тебе проблем с "я"
  Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "Unicode C/C++ programming"
Сообщение от Александр emailИскать по авторуВ закладки(??) on 09-Дек-04, 15:55  (MSK)
>Лучше не заниматься посимвольным копированием. Используй fread() и fwrite() или read() и
>write() и буфер побольше. Работает гораздо быстрее и никаких тебе проблем
>с "я"

Спасибо за совет - учту.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "Unicode C/C++ programming"
Сообщение от toshikstar emailИскать по авторуВ закладки(??) on 15-Дек-04, 07:58  (MSK)
>Лучше не заниматься посимвольным копированием. Используй fread() и fwrite() или read() и
>write() и буфер побольше. Работает гораздо быстрее и никаких тебе проблем
>с "я"

Извените, если не жалко киньте ссылку или опишите как работь с этими опереторами а то докинет и я по старинке посимвольно читаю =)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "Unicode C/C++ programming"
Сообщение от DeadMustdie emailИскать по авторуВ закладки(??) on 15-Дек-04, 20:18  (MSK)
>>Лучше не заниматься посимвольным копированием. Используй fread()
>>и fwrite() или read() и write() и буфер побольше. Работает
>>гораздо быстрее и никаких тебе проблем с "я"

Оные проблемы не getc()ом вызваны, а его не совсем корректным
использованием.

>
>Извените, если не жалко киньте ссылку или опишите как работь с этими
>опереторами а то докинет и я по старинке посимвольно читаю =)
>

man fread
man fwrite

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру