gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:43 24 4
gpt4 key购买 nike

我有一个应用程序可以扫描文件夹路径并将它们呈现给用户。我一直在使用一个简单的实用程序将 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 字节序列如下所示 (try for yourself):

0xC3, 0xA9

what I should do in this case to be able to handle such a path on an English-based system?

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

关于c++ - 在基于英语的系统上将 UTF-8 路径转换为宽字符会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52647434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com