Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема со считыванием символов, Текстовый файл в Unicode. Датский язык. 
:(
    Опции темы
vicq
Дата 1.3.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 21.12.2006
Где: Белгород

Репутация: нет
Всего: нет



Дело было так: текст на датском языке в юникоде в текстовике. Открыл для чтения как текстовый файл ("r"). Первыми считались 2 символа, которых нет в текстовике. Потом начали считываться символы текстовика, но странным образом: Символ(латинский), потом мусор вроде \x0, потом символ(латинский) и т.д. в том же духе. Аски коды символов латиницы соответствуют им в таблице. Другие символы имеют код -10, -2 и т.д.
Проблема наверное в том, что текстовый файл считывается по 1 байту. т.е. символы с кодом больше 255 считываются некорректно. Тогда как считать этот текст? Может в бинарном режиме читать? Тогда подскажите функцию(наверное fread, напишите пожалуйста параметры для моего примера)
Спасибо!

Это сообщение отредактировал(а) vicq - 1.3.2009, 11:41
PM MAIL ICQ   Вверх
zim22
Дата 1.3.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



используйте тип wchar_t вместо char или wstring вместо string
Код

std::ifstream in("file.txt");
std::wstring word;
while (in >> word)
std::cout << word;



--------------------
PM MAIL   Вверх
pan2004
Дата 1.3.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 2
Всего: 9



Цитата(vicq @  1.3.2009,  11:39 Найти цитируемый пост)
Первыми считались 2 символа, которых нет в текстовике

они есть, этот спецсимвол указывает на кодировку текстового файла(UTF8, UTF16, UCS...)


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
vicq
Дата 1.3.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 21.12.2006
Где: Белгород

Репутация: нет
Всего: нет



А getc или fread'ом это  можно сделать?
PM MAIL ICQ   Вверх
vicq
  Дата 1.3.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 21.12.2006
Где: Белгород

Репутация: нет
Всего: нет



В юникоде символ занимает 2 байта. Тогда почему
Код

int simbol;
fread(&simbol,2,1,fp);

возвращает значения 1442038 и тому подобные...?

Это сообщение отредактировал(а) vicq - 1.3.2009, 13:16
PM MAIL ICQ   Вверх
mes
Дата 1.3.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(vicq @  1.3.2009,  12:15 Найти цитируемый пост)
В юникоде символ занимает 2 байта.

smile
 http://ru.wikipedia.org/wiki/%D0%A3%D0%BD%...%BA%D0%BE%D0%B4 smile 


Это сообщение отредактировал(а) mes - 1.3.2009, 14:11


--------------------
PM MAIL WWW   Вверх
zim22
Дата 1.3.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



лови код
Код
#include <cstdio>

int main(int argc, char **argv)
{    
    FILE *fp = fopen("1.txt", "r");        
    wchar_t symbol[256];

    fseek(fp, 2, SEEK_SET);    
    fread(&symbol, sizeof(wchar_t), 28, fp);

    return 0;
}



как работает функция fread можешь здесь почитать: http://www.cplusplus.com/reference/clibrar...tdio/fread.html

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  1.txt 0,05 Kb


--------------------
PM MAIL   Вверх
pan2004
Дата 1.3.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 2
Всего: 9



Цитата(zim22 @  1.3.2009,  14:18 Найти цитируемый пост)
лови код

самое забавное здесь - размер wchar_t зависит от платформы(на Вин он 2, на Лине 4 байта), поэтому файл может и не прочитаться таким прямым способом. Кроме того, UTF ные кодировки таким образом тоже не прочитаешь(у них переменный размер символов)...


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
vicq
Дата 1.3.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 21.12.2006
Где: Белгород

Репутация: нет
Всего: нет



Цитата

Кроме того, UTF ные кодировки таким образом тоже не прочитаешь(у них переменный размер символов)...


только не понятно: максимальное значение кода по таблице юникод - 65536. переменный размер это 1 и 2 байта(коды до 255 и те, что после). так получается?
тогда как с этим справиться?

кстати, zim22, символы в твоем текстовике имеют коды до 255, т.е. занимают по 1 байту.
PM MAIL ICQ   Вверх
pan2004
Дата 1.3.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 2
Всего: 9



Цитата(vicq @  1.3.2009,  21:15 Найти цитируемый пост)
максимальное значение кода по таблице юникод

UCS4 занимает 4 байта, так что максимальное теоретическое значение составляет примерно 4 миллиарда символов.
На самом деле, 65535 уже не хватает, и некоторые места "за 65 тысячами" уже заняты. Мало кто с ними встречался, так как там находятся относительно редкие символы(например из искусственных языков), но они существуют - это факт.
Цитата(vicq @  1.3.2009,  21:15 Найти цитируемый пост)
переменный размер это 1 и 2 байта

UTF кодировки могут иметь размер символа от одного двух то ли до 6 то ли до 8 байт(точно не помню, см википедию).
Цитата(vicq @  1.3.2009,  21:15 Найти цитируемый пост)
тогда как с этим справиться?

Загружают в память в массив байтов(char), потом спец функциями преобразуют к wchar_t строкам. Можно использовать специальные библиотеки, например ICU, в Qt QString поддерживает различные уникод форматы. Насчет стандартной библиотеки - в C++03 поддержка уникода сильно ограничена, но в C++09 должно появится много нового)

Это сообщение отредактировал(а) pan2004 - 1.3.2009, 22:32


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
vicq
Дата 2.3.2009, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 21.12.2006
Где: Белгород

Репутация: нет
Всего: нет



ICU - это то, что надо. Только документацию на русском найти бы... Может кто-нибудь знает где взять её?
На английском сложнее разобраться.
PM MAIL ICQ   Вверх
zim22
Дата 2.3.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69





--------------------
PM MAIL   Вверх
jonie
Дата 2.3.2009, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата(pan2004 @ 1.3.2009,  12:22)
Цитата(vicq @  1.3.2009,  11:39 Найти цитируемый пост)
Первыми считались 2 символа, которых нет в текстовике

они есть, этот спецсимвол указывает на кодировку текстового файла(UTF8, UTF16, UCS...)

врешшшььь... это BOM для текста в кодировке UCS2.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
cutwater
Дата 2.3.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



Цитата(jonie @  2.3.2009,  11:42 Найти цитируемый пост)
врешшшььь... это BOM для текста в кодировке UCS2.



Нееее  smile , Вы не правы.
http://en.wikipedia.org/wiki/Byte-order_mark   smile 



--------------------
user posted image
PM MAIL   Вверх
pan2004
Дата 2.3.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 2
Всего: 9



Цитата(jonie @  2.3.2009,  12:42 Найти цитируемый пост)
врешшшььь... это BOM для текста в кодировке UCS2.

Не только. По википедии, по этому символу(точнее по его кодированному виду) можно определить не только порядок байтов, но и какая из UTF/UCS кодировок используется.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1271 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.