在基于英语的系统上将 UTF-8 路径转换为宽字符会引发异常
Converting UTF-8 path to wide characters on English-based system throws exception
我有一个扫描文件夹路径并将其呈现给用户的应用程序。 长期以来,我一直在使用一个简单的实用程序将 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());
}
今天,该实用程序首次尝试转换此字符串并出现异常
I:\Scans\Nouvelles numérisations
这是我运行其他应用程序的法语版本并将某些内容保存到我的应用程序扫描的文件夹中时创建的文件夹路径。 (我正在运行以英语-美国作为我的区域设置的系统(。
此路径导致标准C++库从 from_bytes 函数内部抛出range_error异常(以"错误转换"作为文本(,标准库似乎无法转换带有重音符号的字符......
é
我可以看到几种处理这种情况的方法,包括捕获异常(并返回"(或在这种情况下返回默认错误字符串。 (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
这些数字是否代表"正确的"UTF-8 表示形式? 我什至不知道。 国际化对我来说并不适合。
我在这里做错了什么吗? 缺少一些简单的东西? 这是扫描文件夹并将其呈现给用户进行导航的应用的一部分。 我希望能够处理具有此类字符的路径的情况,正确转换它们并继续。
有人可以给我一些指导,说明在这种情况下我应该怎么做才能在基于英语的系统上处理这样的路径吗?
std::wstring_convert
通过抛出异常来做正确的事情。
0xe9
不是字符é
的有效 UTF-8 字节序列。只有 0-127(基本 ASCII(范围内的码位不需要特殊编码。
字符é
的有效 UTF-8 字节序列如下所示(请自行尝试(:
0xC3, 0xA9
在这种情况下,我应该怎么做才能在 基于英语的系统?
这种情况是输入中的错误,应按此处理。例如,向用户报告错误,以便他们修复输入。
- 如何转换真实路径 CString c++
- 在基于英语的系统上将 UTF-8 路径转换为宽字符会引发异常
- 将带斜杠的 Unix 路径转换为 Windows 路径
- 如何将文件系统路径转换为字符串
- 无法转换 .CATPart 文件.错误:输入文件路径似乎包含不支持的字符
- 如何将Qt文件路径从资源转换为绝对路径?
- 将 URI 转换为路径
- 如何将应用程序URI转换为普通文件路径
- 将 UNC 路径转换为网络系统的本地路径
- 如何将目录路径转换为唯一的数字标识符 (Linux/C++)
- Direct2D:将文本转换为路径
- 如何将路径存储在这种结构中,以及如何将其转换为其他内容
- 转换在路径和矩形中的工作方式不同
- 使用 SHGetPathFromIDList 将 PIDL 转换为文件路径
- 如何使用Qt / C++将GUI转换为Windows上的路径
- 将相对路径转换为完整路径的系统功能,即使对于不存在的路径也适用
- 无法将Boost路径迭代器转换为字符串
- 使用C++转换物理驱动器路径
- 如何将带有 ".."(向上)组件的 boost::filesystem::p ath 转换为正确的路径
- 为什么 opendir() 在使用 c_str() 转换路径类型后不打开路径?