Преобразование пути UTF-8 в широкие символы в английской системе вызывает исключение - PullRequest
0 голосов
/ 04 октября 2018

У меня есть приложение, которое сканирует пути к папкам и представляет их пользователю.Я давно использую простую утилиту для преобразования из UTF-8 в широкие строки.Это сработало очень хорошо.Но сегодня он начал выдавать исключение, и мне нужно выяснить, что делать.

Это функция.

inline std::wstring convertutf8(const std::string& p) 
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> wconv;
    return wconv.from_bytes(p.c_str());
}

Сегодня утилита впервые попыталась преобразовать эту строку иthew исключение

I: \ Scans \ Nouvelles numérisations

Этот путь к папке был создан, когда я запустил французскую версию какого-либо другого приложения и что-то сохранил в папкечто мое приложение сканирует.(Я работаю в системе с английским-американским языком в качестве локали).

Этот путь заставил стандартную библиотеку C ++ выдать исключение range_error (с текстом «плохое преобразование» в качестве текста) изнутри функции from_bytesстандартная библиотека, кажется, не может преобразовать символ с символом ударения ...

é

Я вижу несколько способов справиться с ситуацией, в том числеперехват исключения (и возврат "") или, возможно, возвращение строки ошибки по умолчанию в таком случае.(wstring_convert имеет средство для этого в конструкторе).Но мне нужно понять это лучше.

Я безрассудно надеялся, что использование wstring_convert с codecvt_utf8 позволит мне справиться с такими ситуациями.До сих пор мое приложение, похоже, правильно обрабатывало даже китайские пути с апломбом.Поэтому я удивлен, что это доставляет мне неприятности

Когда я смотрю на текст проблемного символа в отладчике (и тех, кто его окружает), я вижу следующее

CHAR   DEC     HEX
----   ---     ----
 'n'   110     0x6e
 'u'   117     0x75
 'm'   109     0x6d
 'é'   -23     0xe9
 'r'   114     0x72
 'i'   105     0x69

Doэти цифры представляют "правильное" представление UTF-8?Я бы даже не знал.Интернационализация мне не подходит.

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

Может ли кто-нибудь дать мне некоторые указания относительно того, что я должен сделать в этом случае, чтобы иметь возможность обрабатывать такой путь в английской системе?

1 Ответ

0 голосов
/ 04 октября 2018

std::wstring_convert делает правильные вещи, создавая исключение.

0xe9 не является допустимой последовательностью байтов UTF-8 для символа é.Только кодовые точки в диапазоне 0-127 (базовый ASCII) не нуждаются в специальном кодировании.

Допустимая последовательность байтов UTF-8 для символа é будет выглядеть следующим образом ( Попробуйте сами ):

0xC3, 0xA9

что мне следуетделать в этом случае, чтобы иметь возможность обрабатывать такой путь в английской системе?

Этот случай является ошибкой ввода и должен обрабатываться как таковой.Например, сообщите об ошибке пользователю, чтобы он исправил ввод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...