2015-04-15 3 views
1

В этом простом коде у меня есть проблемы с Unicode:QString в StD :: строка Unicode проблемы

QString qs = QFileDialog::getOpenFileName(0,"","",""); 
std::string str = qs.toUtf8().constData(); 
Mat m = imread(str); 

Когда достаточное количество является латинским голец набор работает отлично, но когда путь содержит кириллические символы я получаю плохое обращение. Как образец: QS "E: /Кирилиця_49.png": ул «E:/РљРёСЂРёР» РёС † СЏ_49.png»

Я знаю, что происходит, когда ул не на UTF-8 символов набора, но в проекте свойства «Свойство символов» - «Использовать набор символов Юникода». Компилятор MSVC 2010, Qt 5.3.2. В чем может быть проблема?

+0

'QString' хранит данные в unicode. Таким образом, ваше преобразование в порядке. Это не зависит от свойства «Использовать набор символов Unicode». Какой у Вас вопрос? Не могли бы вы сказать, где именно у вас проблема? При выводе для отладки utf строк? –

+0

Проблема в том, что я получаю «E:/РљРёСЂРёР» РёС † СЏ_49.png », но не« E: /Кирилиця_49.png ». Эти значения I копируются из debuger – Bleach

+0

Почему бы не использовать 'QString :: toStdString()' или, скорее, 'QString :: toStdWString()'? – vahancho

ответ

1

Я считаю, что QString::toUtf8() выполняет свою работу правильно (по модулю некоторые ошибки в реализации Qt ...).

Проблема может быть, что вы используете отладчик визуализатор для содержания std::string, который показывает строку интерпретируя его с помощью какой-то «кодовой страницы» вместо Unicode UTF-8.

В принципе, содержимое строки (в виде сырых байтов) является правильным (это всего лишь последовательность байтов UTF-8, соответствующая исходной строке Unicode UTF-16): вы просто используете некоторые «очки неправильного цвета», чтобы посмотреть на это:

Важным моментом является то, в каком формате функция imread() ожидает своего параметра строки? Если imread() ожидает строку UTF-8, то вы правы, передавая в качестве аргумента std::string с кодированной строкой UTF-8.

+0

> вы просто используете некоторые «очки неправильного цвета», чтобы посмотреть на него :) – Bleach

+2

Также, чтобы увидеть правильную строку в отладчике 'str.c_str(), s8' можно использовать в случае msvc. – Predelnik

+0

> вы просто используете некоторые «очки неправильного цвета», чтобы посмотреть на него :) - нет, потому что imread (str) возвращает NULL, если путь или имя файла содержат кириллические символы. Я думаю, что кодовая страница std :: string не является utf8. Как я могу изменить его на utf8? В qt4 я создаю QtextCodec :: setCodecForCStrings (QTextCodec :: codecForName ("utf-8")), но в qt5 эта функция устарела. – Bleach

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