Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 01.05.2014
Сообщений: 72
Записей в блоге: 1
1

Не читаются русские символы в wchar_t

07.03.2015, 22:18. Показов 3447. Ответов 11
Метки нет (Все метки)

привет
Что-то не срастается при чтении русских символов их файла. Файл file.txt содержит строку "Новая папка". Читаем:

C++
1
2
3
4
5
6
7
        wchar_t s[20];
        FILE* file = _wfopen(L"c:\\file.txt", L"r");
 
        if (file != NULL)
            fgetws(s, 20, file);
 
        fclose(file);
В итоге s содержит строку "новая папк". Из-за чего такое может быть? Как тогда правильно проитать чтобы без кракозябр?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2015, 22:18
Ответы с готовыми решениями:

Широкие символы wchar_t wstring не хотят принимать русские символы
Собственно вопрос в шапке, вот примеры: std::wstring str = L"блин комом"; и такое: wchar_t...

Не читаются русские символы на сайте
Здравствуйте уважаемые форумчане! Есть сайт, который упорно не хочет мне показывать русские буквы -...

Не читаются русские буквы
Здравствуйте, написал прогу, которая читает csv файл в бд mysqli и выводит на экран. Всё бы хорошо,...

Не правильно читаются с клавиатуры русские буквы
Здравствуйте, начал учить тему "Работа с файлами" и вообщем у меня почему-то не записываються...

11
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11059 / 7015 / 1658
Регистрация: 25.07.2009
Сообщений: 12,781
07.03.2015, 22:30 2
rigorMortis, прежде всего - файл в какой кодировке?
0
0 / 0 / 0
Регистрация: 01.05.2014
Сообщений: 72
Записей в блоге: 1
08.03.2015, 00:01  [ТС] 3
Цитата Сообщение от easybudda Посмотреть сообщение
rigorMortis, прежде всего - файл в какой кодировке?
А где посмотреть? В свойствах файла нету. Создавал как обычно в винде в контекстном меню "Создать текстовой файл".
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11059 / 7015 / 1658
Регистрация: 25.07.2009
Сообщений: 12,781
08.03.2015, 02:14 4
Цитата Сообщение от rigorMortis Посмотреть сообщение
Создавал как обычно в винде в контекстном меню "Создать текстовой файл".
А потом открыл блокнотом и что-то туда написал? Нужно в блокноте смотреть, в какой кодировке он файлы сохраняет. Скорее всего cp1251, а в программе читается, как wchar_t... Можно попробовать открыть его в WordPad и пересохранить в utf-8.
0
2626 / 2211 / 237
Регистрация: 03.07.2012
Сообщений: 7,990
Записей в блоге: 1
08.03.2015, 08:27 5
ТС, чего гадать - прикрепи файл к сообщению.
0
0 / 0 / 0
Регистрация: 01.05.2014
Сообщений: 72
Записей в блоге: 1
08.03.2015, 12:58  [ТС] 6
Файл пересохранил в UTF-8. В C# нормально читается.


C#
1
2
3
            StreamReader sr = new StreamReader(@"c:\file.tn", Encoding.UTF8);
            string t = sr.ReadLine();
            sr.Close();
си++ по-прежнему кракозябры.
Вложения
Тип файла: txt file.txt (28 байт, 5 просмотров)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11059 / 7015 / 1658
Регистрация: 25.07.2009
Сообщений: 12,781
08.03.2015, 14:08 7
Цитата Сообщение от rigorMortis Посмотреть сообщение
по-прежнему кракозябры
У меня вот так отработало:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
 
int main(void) {
    FILE * f;
    wchar_t buf[BUFSIZ];
    
    if ( ! setlocale(LC_ALL, "ru_RU.UTF-8") ) {
        perror("setlocale");
        exit(1);
    }
    
    if ( ! ( f = fopen("file.txt", "r") ) ) {
        perror("fopen");
        exit(1);
    }
    
    while ( fgetws(buf, BUFSIZ, f) )
        printf("%ls", buf);
    
    return ( ferror(f) || fclose(f) );
}
Не читаются русские символы в wchar_t

А в виндовсе надо ещё консоли объяснить, что у неё кодировка utf-8. Можно попробовать в начале
C
1
system("chcp 65001");
вставить, есть шанс, что поможет...
0
0 / 0 / 0
Регистрация: 01.05.2014
Сообщений: 72
Записей в блоге: 1
08.03.2015, 15:11  [ТС] 8
Не помогает ничего. setlocale(LC_ALL, "ru_RU.UTF-8") выдаёт ошибку, сделал setlocale(LC_ALL, "Russian"). В buf читает новая папка.
Так же printf("%ls", buf); и wprintf(L"%s", buf);.
0
2626 / 2211 / 237
Регистрация: 03.07.2012
Сообщений: 7,990
Записей в блоге: 1
08.03.2015, 22:37 9
Лучший ответ Сообщение было отмечено rigorMortis как решение

Решение

Для преобразований utf8->wide есть функция:
https://msdn.microsoft.com/en-... s.85).aspx
1
0 / 0 / 0
Регистрация: 01.05.2014
Сообщений: 72
Записей в блоге: 1
09.03.2015, 15:04  [ТС] 10
Цитата Сообщение от zer0mail Посмотреть сообщение
Для преобразований utf8->wide есть функция:
https://msdn.microsoft.com/en-... s.85).aspx
Совсем другое дело:

C++
1
2
3
4
5
6
7
8
9
    char* tmp = (char*)malloc(sizeof(char)* 100);
    FILE* file = fopen("c:\\file.txt", "r");
    if (file != NULL)
        fgets(tmp, 50, file);
    fclose(file);
 
    LPWSTR response = (LPWSTR)malloc(sizeof(LPWSTR)* 100);
    int contentLength = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, tmp, -1, response, 0);
    MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, tmp, -1, response, contentLength);
Так работает.

Добавлено через 2 часа 14 минут
А так не работает:

C++
1
2
3
4
    char* tmp = "новая папка";
    LPWSTR response = (LPWSTR)malloc(sizeof(LPWSTR)* 100);
    int contentLength = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, tmp, -1, response, 0);
    MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, tmp, -1, response, contentLength);

GetLastError() возвращает 1113.
0
2626 / 2211 / 237
Регистрация: 03.07.2012
Сообщений: 7,990
Записей в блоге: 1
09.03.2015, 19:32 11
Цитата Сообщение от rigorMortis Посмотреть сообщение
char* tmp = "новая папка";
Это не utf8 кодировка (возможно, CP_1251)
0
0 / 0 / 0
Регистрация: 01.05.2014
Сообщений: 72
Записей в блоге: 1
09.03.2015, 23:01  [ТС] 12
Да, так работает:

C++
1
MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, tmp, -1, response, contentLength);
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2015, 23:01

Пропадают русские символи при конвертации из wchar_t to char
string WcharToChar( const wstring&amp; str){ char * res = (char*)malloc(str.length());...

GetWindowText, не читаются символы из Edit-а
Объясните пожалуйста, где я накосячил с GetWindowText? Я хочу прочитать 10 символов из edit в...

В директории сохранения файла русские символы заменяются на непонятные символы
При сохранении файл через диалоговое окно русские символы заменяются на непонятные тем самым Window...

Вывести символы wchar_t
Здраствуйте, почему-то не получается записать в файл символы wchar_t, подскажите, пожалуйста, что я...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru