Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/14: Рейтинг темы: голосов - 14, средняя оценка - 5.00
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
1

Считать utf-8 из файла

02.09.2014, 12:45. Просмотров 2694. Ответов 15
Метки нет (Все метки)

Доброго времени суток. Задача следующая. Есть текстовый файл - словарь в utf-8 кодировке. Слова разделены переводом строки.
Считываю строку из файла в char массив:
C++
1
2
3
4
5
6
7
char str_utf8[1024];
char str_any[1024];
fgets(str_utf8,1024,file);
 
//Здесь нужно преобразовать utf-8 в адский код или другой, который отобразит нужный язык(пока только русский)
 
cout<<str_any<<endl;
И, соответственно обратное преобразование в utf-8 для сохранения в файл. Как я понял, нужны
C++
1
2
WideCharToMultiByte(...);
MultiByteToWideChar(...);
Но никак не пойму какие параметры давать этим функциям. Помогите пожалуйста разобраться.

Добавлено через 3 минуты
Или же есть возможность выводить utf-8 на консоль без преобразования? Или в оконном приложении есть возможность обойтись без преобразования?

Добавлено через 2 минуты
Очень желательно именно char, а не различные модификации символьных строк...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2014, 12:45
Ответы с готовыми решениями:

Считать текст из файла с кодировкой utf-16 LE
Возникла кое-какая проблема. У меня имеется xml файл, в кодировке UTF-16 LE с определенным...

Какой самый универсальный способ считать UTF-8 текст на кириллице из файла?
Считать UTF-8 текст на кириллице из файла? Нашел много способов, но все они страшные до безобразия....

Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32
Собсно сабж.

Создание файла в UTF-8 кодировке
Здравствуйте! Как сделать что бы в данной ситуации файл создавался в utf-8 DWORD tmp0; ...

Перевод текстового файла в UTF-8
Добрый день. Мне дали задание составить программу, конвертирующую текстовый файл (кириллица по...

15
Vadim_H
44 / 3 / 0
Регистрация: 09.07.2014
Сообщений: 37
02.09.2014, 13:16 2
Попробуйте
C++
1
Setlocale(LC_ALL, "Russian_Russia.1251")
И насколько я знаю юникод-это wchar_t,а не просто char
0
MrGluck
Модератор
Эксперт CЭксперт С++
8114 / 4966 / 1436
Регистрация: 29.11.2010
Сообщений: 13,456
02.09.2014, 13:20 3
Нормальный подход - читать в std::wstring (если хотите так в С-style, то wchar_t*)
Вешайте на поток
C++
1
<название потока>.imbue(std::locale(<название потока>.getloc(), new std::codecvt_utf8<wchar_t>));
Добавлено через 31 секунду
Цитата Сообщение от Vadim_H Посмотреть сообщение
wchar_t,а не просто char
способ хранения, utf8 влезает в char
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
02.09.2014, 14:07  [ТС] 4
Заранее извиняюсь, если не прав.

Добавлено через 23 минуты
Цитата Сообщение от MrGluck Посмотреть сообщение
способ хранения, utf8 влезает в char
utf-8 - это же "плавающий" тип текста, т.е. размер каждого символа может варьироваться, а wchar_t - 16-битные символы? Или я не правильно понял? Нужно преобразовывать из utf-8 в wchar_t тот же?

Добавлено через 2 минуты
Воспользовался
C++
1
2
    SetConsoleCP (CP_UTF8);
    SetConsoleOutputCP (CP_UTF8);
Текст вывелся правильно, только перед словом добавился символ квадрата...а будет ли, например, китайский выводиться правильно? И как избавиться от квадратика?)

Добавлено через 12 секунд
Воспользовался
C++
1
2
    SetConsoleCP (CP_UTF8);
    SetConsoleOutputCP (CP_UTF8);
Текст вывелся правильно, только перед словом добавился символ квадрата...а будет ли, например, китайский выводиться правильно? И как избавиться от квадратика?)

Добавлено через 9 минут
Сейчас попробую будет ли работать такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <windows.h>
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
void main()
{
    SetConsoleCP (CP_UTF8);
    SetConsoleOutputCP (CP_UTF8);
 
    char str[1024];
    FILE*file=fopen("slovar.txt","rt");
    fgets(str,1024,file);
 
    printf("%s",&str[3]);
 
    fclose(file);
}
с др. языками. Русский и английский пашет
0
Alex5
1124 / 784 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
02.09.2014, 15:01 5
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Но никак не пойму какие параметры давать этим функциям
Перевод из utf-8 в wide char. (Из UTF-8.)
MultiByteToWideChar function

C++
1
2
3
4
    int n = MultiByteToWideChar( CP_UTF8, 0, 
        buf,   s1, //  s1 - size in bytes 
        buf2, s2  //  s2  -  size, in characters
        );
1
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
02.09.2014, 15:28  [ТС] 6
Цитата Сообщение от Alex5 Посмотреть сообщение
C++
1
2
3
4
int n = MultiByteToWideChar( CP_UTF8, 0, 
     buf,   s1, //  s1 - size in bytes 
     buf2, s2  //  s2  -  size, in characters
    );
Спасибо за ответ по-существу! Подскажите пожалуйста ещё какого типа передаваемые строки - char, wchar_t или ещё какие? Или без разницы?

Добавлено через 1 минуту
Цитата Сообщение от Alex5 Посмотреть сообщение
Перевод из utf-8 в wide char
И если не затруднит, в таком же виде параметры для обратного преобразования?
0
Alex5
1124 / 784 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
02.09.2014, 16:57 7
Retyrn0, вот скопировал из msdn:
C++
1
2
3
4
5
6
7
8
int MultiByteToWideChar(
  _In_       UINT CodePage,
  _In_       DWORD dwFlags,
  _In_       LPCSTR lpMultiByteStr,
  _In_       int cbMultiByte,
  _Out_opt_  LPWSTR lpWideCharStr,
  _In_       int cchWideChar
);
LPCSTR, это "long pointer", "const", "string", то есть const char[]
LPWSTR - "long pointer", "wide", "string". То есть, wchar_t[].

Добавлено через 1 минуту
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
02.09.2014, 17:07  [ТС] 8
Цитата Сообщение от Alex5 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
int MultiByteToWideChar(
  _In_     UINT CodePage,
  _In_     DWORD dwFlags,
  _In_     LPCSTR lpMultiByteStr,
  _In_     int cbMultiByte,
  _Out_opt_ *LPWSTR lpWideCharStr,
  _In_     int cchWideChar
)
;
Это я читал) Спасибо. Буду ковыряться.
0
DrOffset
9770 / 5296 / 1295
Регистрация: 30.01.2014
Сообщений: 8,542
02.09.2014, 18:26 9
Цитата Сообщение от Retyrn0 Посмотреть сообщение
а wchar_t - 16-битные символы?
wchar_t тоже может быть плавающим. Причем не обязательно 16-битным. В Linux, например, wchar_t - 4 байта.
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
02.09.2014, 18:30  [ТС] 10
Цитата Сообщение от DrOffset Посмотреть сообщение
wchar_t тоже может быть плавающим.
Я о динамическом плавании. В разных осях - дело одно, а когда, например, в тексте есть русские, английские и китайские символы, при чём каждый имеет заранее неизвестный размер - это другое. Но суть я уловил. Сейчас вроде понемногу получается. Спасибо откликнувшимся!
0
DrOffset
9770 / 5296 / 1295
Регистрация: 30.01.2014
Сообщений: 8,542
02.09.2014, 18:38 11
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Я о динамическом плавании.
А я о чем? И я о том же.

Добавлено через 2 минуты
вот вики. в первом абзаце написано про это
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
02.09.2014, 18:44  [ТС] 12
Цитата Сообщение от DrOffset Посмотреть сообщение
И я о том же.
Ну...
Цитата Сообщение от DrOffset Посмотреть сообщение
В Linux, например, wchar_t - 4 байта
Я предполагаю, что одна и та же программа после запуска не будет выполняться сначала под windows потом под Linux А на одной и той же системе (виндось) sizeof(w_chart) у меня возвращает 2.

Добавлено через 2 минуты
Первая версия Юникода (1991 г.) представляла собой 16-битную кодировку с фиксированной шириной символа(с)Вика.
Первая версия...или wchar_t == utf-16?
0
DrOffset
9770 / 5296 / 1295
Регистрация: 30.01.2014
Сообщений: 8,542
02.09.2014, 19:10 13
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Ну...
Ну что ну. UTF-16, который в windows использует для хранения тип wchar_t, символ может содержать суррогатные пары из двух 2-байтовых слов. Т.е. "плавать" может в диапазоне от 1 до 2 слов. UTF-8 может содержать до 4х байт на символ.
А насчет линукса, просто в линуксе wchar_t - это для UTF-32.

Добавлено через 4 минуты
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Первая версия Юникода (1991 г.) представляла собой 16-битную кодировку с фиксированной шириной символа(с)Вика.
Имеется в виду юникод как стандарт. UTF-16 - это конкретная кодировка юникода, которая была результатом расширения стандарта юникода в 96 году на значительно большее количество символов.

Добавлено через 5 минут
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Первая версия...или wchar_t == utf-16?
wchar_t - это лишь способ хранения символа.
Все типы зависят от платформы и от компилятора. Стандартом гарантируется только, что sizeof(char) == 1
В общем есть такое неравество:
char <= short <= int <= long <= long long
Тоже самое относится к wchar_t. Стандартом не регламентируется, что он два байта. Это регламентируется только в рамках платформы windows. В Linux же, например, для приема по сети utf-16 можно использовать псевдоним int16_t или что-то подобное (в новом стандарте есть специальные типы для юникода).

Цитата Сообщение от Retyrn0 Посмотреть сообщение
Я предполагаю, что одна и та же программа после запуска не будет выполняться сначала под windows потом под Linux
Я это тоже предполагаю, тем более, что это не играет роли, C++ компилируемый язык ведь Это сказано было для сведения. Ну а важно это может быть, например, при сетевом взаимодействии.
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
02.09.2014, 19:16  [ТС] 14
Цитата Сообщение от DrOffset Посмотреть сообщение
wchar_t - это лишь способ хранения символа
Вот я тоже об этом. Т.е. сам тип внутри платформы не плавающий, просто символы могут занимать несколько таких ячеек, на сколько я понял. Но не суть. В принципе я основу понял, спасибо!

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну а важно это может быть, например, при сетевом взаимодействии.
Вот здесь Вы бесконечно правы. Пока цель не стоит, но на будущее, в линуксе чем пользоваться? Или может сразу универсальный тип использовать?
0
DrOffset
9770 / 5296 / 1295
Регистрация: 30.01.2014
Сообщений: 8,542
02.09.2014, 19:28 15
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Т.е. сам тип внутри платформы не плавающий, просто символы могут занимать несколько таких ячеек, на сколько я понял. Но не суть. В принципе я основу понял, спасибо!
Внутри платформы нет. С UTF-8 тоже самое, только там ячейка - 1 байт, а таких ячеек подряд может быть до 4х штук (в зависимости от символа, который кодируем, какой-нибудь шумерский язык может как раз 4 ячейки занимать).
Не за что
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Пока цель не стоит, но на будущее, в линуксе чем пользоваться? Или может сразу универсальный тип использовать?
В линуксе родная кодировка UTF-8. Следовательно все API работает в UTF-8 (однобайтная кодировка - char).
Поэтому, скорее всего, при приеме по сети UTF16 нам придется ее перекодировать в UTF8.
Или, как вариант, воспользоваться средствами библиотеки icu и работать непосредственно с UTF16.
Ну или, скажем, в Qt QString внутри использует UTF32, соответственно перекодировка будет UTF16->UTF32 средствами Qt.
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
02.09.2014, 20:04  [ТС] 16
Цитата Сообщение от DrOffset Посмотреть сообщение
В линуксе родная кодировка UTF-8.
Тогда порядок. В принципе у меня данные в утф-8, получается, что мне только для отображения данных на виндоси нужно изголяться с преобразованием. Тогда вообще шикарно)
0
02.09.2014, 20:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2014, 20:04

Кракозябры при выводе из файла UTF-8
Здравствуйте. Тема кодировки достаточно популярна. Правда, в этих всех темах я, все же, не нашел...

Чтение файла в кодировке utf-8 и вывод в консоль
Здорова! Пытаюсь прочитать файл в кодировке utf-8 (вот он ) и вывожу его в консоль, ничего не...

Нужно считать с файла определенное число символов и эти символы удалить из файла
Нужно считать с файла определенное число символов и эти символы удалить из файла


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru