2015-03-14 4 views
0

Недавно я получил задание, требующее от меня сравнения слов. Я не хочу описывать его полностью, но мне приходится сравнивать слова по-характеру, чтобы увидеть, как похожи два слова.C++: Сравнение строк или wstrings со специальными символами в них (á, é, ő и т. Д.)

Теперь проблема заключается в том, что текст ввода, который я должен использовать, содержит много нестандартных символов, таких как á, é, ő и т. Д. Я попытался использовать строки, wstring, char и wchar_t для представления моих слов, но ничего похоже, работает правильно. Пример:

setlocale(LC_ALL, ""); 

std::vector <Word::Word> words; 

std::wfstream fileWrite("testout.txt"); 
std::wstring s = words[0].getString(); 

fileWrite << s; 

Наша строка содержит слово «Még» здесь. Он выводится правильно. Для записи все работает одинаково, если я использую строку вместо wstring. Следующие работы тоже:

const wchar_t* wc = s.c_str(); 
fileWrite << wc; 

Но как только я пытаюсь ссылки на голец это дает мне бред. Пример:

fileWrite << wc[0] << " " << wc[1]; 

Этот выход «ď» ». Я предполагаю, что проблема заключается в том, что они используют несколько байтов для хранения символа? Я просто дико предполагаю здесь, но это было бы объяснить, почему

wcslen(wc); 

возвращается 7.

Я попытался с помощью функции SubStr как с колонной и wstring, но, как правило, кажется, не работает. Кто-нибудь знает, как решить эту проблему? Я пропустил что-то очевидное здесь?

Кроме того, я использую кодовые блоки с gcc-компилятором, я его где-то читал, что он отлично справляется с wchar и wstring, может быть, проблема? Помните, я пробовал все выше со строкой вместо wstring, и это было то же самое.

Спасибо вам большое за помощь, было бы весьма полезно!

+0

Какова кодировка ввода и кодировка вывода? – orlp

+0

Честно говоря, я не уверен на 100%. Я получил txt-файл для работы, и я не знаю, как проверить кодировку этого. Однако я скопировал его на другой и использовал «Сохранить как ...», чтобы сохранить его с помощью UTF-8. Это должно означать, что кодировка UTF-8 и «оригинал» не имеет значения, не так ли? – akrammon

+0

Назначение не определено, если кодирование неизвестно. После того, как вы знаете кодировку, вам нужно будет посмотреть в unicode. Это непростая задача. – orlp

ответ

1

Эти персонажи не являются необычными. Они являются абсолютно стандартными символами Unicode. К сожалению, обычный стандарт C++ не поддерживает более тонкие детали Unicode. Ваш выбор состоит в том, чтобы либо найти хорошую библиотеку, поддерживающую его (например, для кода, работающего на MacOS X или iOS, вы просто используете то, что встроено в ОС, другие операционные системы могут иметь схожую поддержку) или перейти на www.unicode.org и загружать их таблицы кода. И прочитайте все, что вы можете узнать об этом.

wchar и wstring по своей сути не переносятся. Лучше всего использовать кодировку UTF-8 и стандартную std :: string. И понимание UTF-8 абсолютно необходимо для любого программиста в наши дни.

Здесь была некоторая дискуссия о Блокноте. Многое программное обеспечение пишет UTF-8, которому предшествует маркер байтового байта (BOM) и множество программных приложений, которые распознают UTF-8. Если этот маркер порядка байтов отсутствует, они смотрят на отдельные байты. Существует вероятность того, что файл состоит только из символов ASCII, и в этом случае не имеет значения, какая именно кодировка. Если это не только ASCII, вероятность того, что, например, файл с кодировкой Windows-1252, содержащий не-ASCII-символы, является законным, UTF-8 практически равен нулю.

+0

Следует также отметить, что консоль Windows по умолчанию не является UTF-8 по умолчанию. –

+0

«использовать кодировку UTF-8 и стандартную std :: string». Проблема заключается в том, что строки UTF-8 не разлагаются на «символы» легко, что, по-видимому, является целью OP. Самый простой (далекий) метод работы с Unicode сохраняет все как UCS-4 внутренне и преобразует в/из любой кодировки, которая используется внешне. –

+0

н.м. видит это правильно. Я преобразовал входной файл в UTF-8, так как тогда он работает с wstring, но не совсем корректно для строки (я не могу получить отдельные буквы без преобразования в wstring или wchar_t). Когда вы говорите, что он не переносится, вы имеете в виду, что он будет только для окон или существуют дополнительные ограничения? Кроме того, я даже не понимаю, что вы говорите о «конвертации в UCS-4 внутренне». Можете ли вы опубликовать мне ссылку здесь, чтобы я мог прочитать эту тему? Спасибо за всю помощь, ребята. – akrammon

 Смежные вопросы

  • Нет связанных вопросов^_^