繁体   English   中英

将日语 wstring 转换为 std::string

[英]Convert Japanese wstring to std::string

谁能建议一种将日语std::wstring转换为std::string的好方法?

我使用了下面的代码。 日文字符串无法在英文操作系统上正确转换。

std::string WstringTostring(std::wstring str)
{
    size_t size = 0;
    _locale_t lc = _create_locale(LC_ALL, "ja.JP.utf8");
    errno_t err = _wcstombs_s_l(&size, NULL, 0, &str[0], _TRUNCATE, lc);
    std::string ret = std::string(size, 0);
    err = _wcstombs_s_l(&size, &ret[0], size, &str[0], _TRUNCATE, lc);
    _free_locale(lc);
    ret.resize(size-1);
    return ret;
}

wstring"C\\files\\ブ種別.pdf"

转换后的string"C:\\files\\ブ種別.pdf"

它实际上在我看来是正确的。

那是您的输入的 UTF-8 编码版本(在转换之前可能是 UTF-16),但由于工具链中的某个错误而以 ASCII 解码形式显示。

你只需要校准你的文件/终端/显示器来渲染文本 output 就好像它是 UTF-8 (它是)。


另外,请记住std::string只是一个字节容器,并没有固有地指定或暗示任何特定的编码。 因此,您的问题是“如何在 Windows 中将 UTF-16(包含日文字符)转换为 UTF-8”,或者事实证明,“如何配置终端以显示 UTF-8?”。

如果您对此字符串的显示是 Visual Studio locals window (您建议的情况是您的评论“我在调试时观察到本地 window 中的“ret”字符串的值” )你不走运,因为 VS 没有知道你的字符串的编码是什么(也不会试图找出)。

但是,对于 Visual Studio 的其他方面,例如控制台 output window,有多种方法可以解决此问题(示例)。

编辑:先做一些事情。 Windows 具有 ANSI 代码页的概念。 这是 Windows 假定的非 Unicode 字符串的默认代码页。 每个使用非 Unicode 版本的 Windows API 且未明确指定代码页的程序都使用 ANSI 代码页

ANSI 代码页由控制面板中的“系统默认区域设置”设置驱动。 截至 2020 年 5 月 10 日的 Windows,它位于区域/管理/更改系统语言环境下。 更改该设置需要管理员权限。

默认情况下,系统默认区域设置为英语的 Windows 使用代码页 1252作为 ANSI 代码页。 该代码页不包含日文字符。 因此,在 Unicode 不知道的程序中使用日语是很难或不可能的。

看起来 OP 想要或必须使用使用多字节字符串( std::string和/或char* )的第三方 C++ 代码。 这并不一定意味着它是 Unicode 不知道,但它可能。 OP 试图做什么完全取决于第三方库的编码方式。 这可能根本不可能。


看起来您的问题是某些第三方代码需要 ANSI 中的文件名,并使用 ANSI 函数打开该文件。 在具有系统区域设置默认值的英文系统中,日文无法转换为 ANSI,因为 ANSI 代码页(实际上是 CP1252)不包含日文字符。

我认为您应该做的是,您应该使用GetShortPathNameW获取一个短文件名,将该文件路径转换为 ANSI,然后传递该字符串。 像这样:

std::string WstringFilenameTostring(std::wstring str)
{
    wchar_t ShortPath[MAX_PATH+1];
    DWORD dw = GetShortPathNameW(str.c_str(), ShortPath, _countof(ShortPath));

    char AnsiPath[MAX_PATH+1];
    int n = WideCharToMultiByte(CP_ACP, 0, ShortPath, -1, AnsiPath, _countof(AnsiPath), 0, 0);
    return string(AnsiPath);
}

此代码仅用于文件名 对于任何其他日文字符串,它将返回废话。 在我的测试中,它将“日本语.txt”转换为不可读但字母数字的内容:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM