在基于英语的系统上将 UTF-8 路径转换为宽字符会引发异常

Converting UTF-8 path to wide characters on English-based system throws exception

本文关键字:转换 路径 字符 异常 UTF-8 于英语 英语 系统      更新时间:2023-10-16

我有一个扫描文件夹路径并将其呈现给用户的应用程序。 长期以来,我一直在使用一个简单的实用程序将 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

在这种情况下,我应该怎么做才能在 基于英语的系统?

这种情况是输入中的错误,应按此处理。例如,向用户报告错误,以便他们修复输入。