Member 13323088 Ответов: 1

Как конвертировать csv преобразование файлов в VS2008


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

Что я уже пробовал:

I used ini file to read those languages which works fine but only for unicode. As far as multi-byte is concerned only English and Spanish are read correctly.

Jochen Arndt

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

Китайские и японские кодовые страницы-это настоящие многобайтовые (более одного байта на символ), в то время как латинские языки-это кодовые страницы ANSI (один байт). При обращении с настоящим многобайтовые, есть только несколько API-функций, которые должны быть использованы. Возможно, ваш код этого не делает. Однако в настоящее время вы всегда должны создавать приложения Unicode и конвертировать входные данные, если они используют данные на основе кодовых страниц.

Member 13323088

Я тоже занимался проектом Unicode mfc.. Имея ту же самую проблему,что и я,Я не мог читать японский, китайский, испанский языки из csv-файла...

Member 13323088

bool CSVFile::ReadData(CStringArray &arr)
{
// Проверьте правильный режим в отладочной сборке
ASSERT(m_nMode == modeRead);

// Читать следующую строку
Однако слайн;
if (!ReadString(sLine))
возвращать false;

LPCTSTR p = sLine;
int nValue = 0;

// Разбор значений в этой строке
в то время как (*p != '\0')
{
CString s; // строка для хранения этого значения
если (*p == '"')
{
// Удар мимо открывающей кавычки
p++;

// Анализировать приведенное значение
в то время как (*p != '\0')
{
// Тест на символ цитаты
если (*p == '"')
{
// Нашел одну цитату
p++;

// Если пара котировок, держите одну
// Else интерпретируется как конец значения
если (*p != '"')
{
p++;
перерыв;
}
}

// Добавьте этот символ в значение
С. AppendChar(*Р++);
}
}
еще
{
// Разбор значения без кавычек
в то время как (*p != '\0' && *p != ',')
{
С. AppendChar(*Р++);
}

// Переход к следующему символу (если еще не конец строки)
если (*p != '\0')
p++;
}

// Добавьте эту строку в массив значений
если (nValue &ЛТ; обр. GetCount())
arr[nValue] = s;
еще
ОБР.Добавить(с);

nValue++;
}

// Обрезать все неиспользуемые значения массива
если (обр. GetCount() &ГТ; nValue)
arr.RemoveAt(nValue, arr.GetCount() - nValue);

// Мы возвращаем true, если ReadString() преуспел-даже если нет значений
вернуть true;
}

чтобы прочитать csv-файл.

1 Ответов

Рейтинг:
0

Jochen Arndt

Все последующее предполагает, что ваше приложение является сборкой Unicode.

Похоже, что вы получили свой CSVFile класс от CStdioFile. Затем ReadString() преобразует содержимое многобайтового файла в широкий символ, используя фактически выбранную кодовую страницу пользователя, запускающего ваше приложение. Это приведет к неправильным результатам, если CSV-файл был создан с другой кодировкой.

Основная проблема заключается в том, чтобы знать, какая кодировка / кодовая страница была использована для создания CSV-файла. Если у вас есть контроль над этим, я предлагаю использовать UTF-8, если это возможно.

Как только вы узнаете кодовую страницу, считайте содержимое файла в char буфер (например, с помощью fgets()) и позвоните в Функция MultiByteToWideChar (Windows)[^] для преобразования в Юникод.