C++ 用unicode c+编码路径+;

C++ 用unicode c+编码路径+;,c++,unicode,encoding,utf-8,C++,Unicode,Encoding,Utf 8,我在打开UTF-8路径文件时遇到问题。具有UTF-8字符的路径(如西里尔语或拉丁语)。我用\uwfopen找到了解决这个问题的方法,但解决这个问题的方法是我用UTF手工编码UTF-8字符(\uxxx) 是否有一个函数、宏或任何东西,当我提供字符串(路径)时,它将返回Unicode 大概是这样的: 我尝试了使用MultiByteToWideChar,但它返回了一些不相关的十六进制数 尝试: std::wstring s2ws(const std::string& s) { int

我在打开UTF-8路径文件时遇到问题。具有UTF-8字符的路径(如西里尔语或拉丁语)。我用
\uwfopen
找到了解决这个问题的方法,但解决这个问题的方法是我用UTF手工编码UTF-8字符(\uxxx)

是否有一个函数、宏或任何东西,当我提供字符串(路径)时,它将返回Unicode

大概是这样的:

我尝试了使用MultiByteToWideChar,但它返回了一些不相关的十六进制数

尝试:

std::wstring s2ws(const std::string& s)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}
std::wstring stemp = s2ws(x);
LPCWSTR result = stemp.c_str();
我得到的结果是:
0055F7E8

先谢谢你

更新: 我安装了boost,现在我正试图用boost来实现它。谁能帮我一把吗

所以我有一条路:
wcharžt path[100]=“čaćžđ\\test.txt”)

我需要将其转换为:


wchar\u t s[100]=“u010d\u0061\u0107\u0161\u017e\u0111\\test.txt”)

这里有一种在Windows上在UTF-8和UTF-16之间转换的方法,以及显示输入和输出的存储代码单位的实际值:

#include <codecvt>
#include <iostream>
#include <iomanip>
#include <string>

int main() {
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> convert;

    std::string s = "test";

    std::cout << std::hex << std::setfill('0');
    std::cout << "Input `char` data: ";
    for (char c : s) {
      std::cout << std::setw(2) << static_cast<unsigned>(static_cast<unsigned char>(c)) << ' ';
    }
    std::cout << '\n';

    std::wstring ws = convert.from_bytes(s);

    std::cout << "Output `wchar_t` data: ";
    for (wchar_t wc : ws) {
      std::cout << std::setw(4) << static_cast<unsigned>(wc) << ' ';
    }
    std::cout << '\n';
}
然后,在使用Visual Studio的Windows上,程序的输出为:

输入
char
数据:C487
输出数据:0107

这与使用测试字符串(如:

std::string s = "ć";

这可能导致以下输出:

输入
char
数据:3f
输出数据:003f

这里的问题是VisualStudio没有使用UTF-8作为字符串的编码,因此您请求从UTF-8转换可能不是您真正需要的;或者您确实需要从UTF-8转换,但您正在使用与实际输入不同的输入测试潜在的转换例程


所以我有一个路径:wchar_t path[100]=_t(“čaćšžđ\ test.txt”)

我需要将其转换为:

wchar_t s[100]=“u010d\u0061\u0107\u0161\u017e\u0111\test.txt”)

好吧,如果我理解正确的话,你的实际问题是以下几点失败了:

wchar_t path[100] = _T("čaćšžđ\\test.txt");
FILE *f = _wfopen(path, L"w");
但是如果你改为写字符串,比如:

wchar_t path[100] = _T("\u010d\u0061\u0107\u0161\u017e\u0111\\test.txt");
然后,
\wfopen
调用成功并打开所需的文件

首先,这与UTF-8完全无关。我假设您使用
char
字符串找到了一些解决方法,并将其转换为
wchar\t
,您不知何故将其解释为涉及UTF-8或其他内容

保存源代码时使用的编码是什么?字符串
L“čaćŠđ\\test.txt”
是否正确保存?尝试关闭源文件并重新打开它。如果某些字符显示为替换为
,则部分问题在于源文件编码。尤其是北美和西欧大部分地区的Windows使用的默认编码:“西欧(Windows)-代码页1252”

您还可以检查以下程序的输出:

#include <iomanip>
#include <iostream>

int main() {
    wchar_t path[16] = L"čaćšžđ\\test.txt";

    std::cout << std::hex << std::setfill('0');
    for (wchar_t wc : path) {
        std::cout << std::setw(4) << static_cast<unsigned>(wc) << ' ';
    }
    std::cout << '\n';
    wchar_t s[16] = L"\u010d\u0061\u0107\u0161\u017e\u0111\\test.txt";

    for (wchar_t wc : s) {
        std::cout << std::setw(4) << static_cast<unsigned>(wc) << ' ';
    }
    std::cout << '\n';
}

这里有一种在Windows上在UTF-8和UTF-16之间转换的方法,以及显示输入和输出的存储代码单元的实际值:

#include <codecvt>
#include <iostream>
#include <iomanip>
#include <string>

int main() {
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> convert;

    std::string s = "test";

    std::cout << std::hex << std::setfill('0');
    std::cout << "Input `char` data: ";
    for (char c : s) {
      std::cout << std::setw(2) << static_cast<unsigned>(static_cast<unsigned char>(c)) << ' ';
    }
    std::cout << '\n';

    std::wstring ws = convert.from_bytes(s);

    std::cout << "Output `wchar_t` data: ";
    for (wchar_t wc : ws) {
      std::cout << std::setw(4) << static_cast<unsigned>(wc) << ' ';
    }
    std::cout << '\n';
}
然后,在使用Visual Studio的Windows上,程序的输出为:

输入
char
数据:C487
输出数据:0107

这与使用测试字符串(如:

std::string s = "ć";

这可能导致以下输出:

输入
char
数据:3f
输出数据:003f

这里的问题是VisualStudio没有使用UTF-8作为字符串的编码,因此您请求从UTF-8转换可能不是您真正需要的;或者您确实需要从UTF-8转换,但您正在使用与实际输入不同的输入测试潜在的转换例程


所以我有一个路径:wchar_t path[100]=_t(“čaćšžđ\ test.txt”)

我需要将其转换为:

wchar_t s[100]=“u010d\u0061\u0107\u0161\u017e\u0111\test.txt”)

好吧,如果我理解正确的话,你的实际问题是以下几点失败了:

wchar_t path[100] = _T("čaćšžđ\\test.txt");
FILE *f = _wfopen(path, L"w");
但是如果你改为写字符串,比如:

wchar_t path[100] = _T("\u010d\u0061\u0107\u0161\u017e\u0111\\test.txt");
然后,
\wfopen
调用成功并打开所需的文件

首先,这与UTF-8完全无关。我假设您使用
char
字符串找到了一些解决方法,并将其转换为
wchar\t
,您不知何故将其解释为涉及UTF-8或其他内容

保存源代码时使用的编码是什么?字符串
L“čaćŠđ\\test.txt”
是否正确保存?尝试关闭源文件并重新打开它。如果某些字符显示为替换为
,则部分问题在于源文件编码。尤其是北美和西欧大部分地区的Windows使用的默认编码:“西欧(Windows)-代码页1252”

您还可以检查以下程序的输出:

#include <iomanip>
#include <iostream>

int main() {
    wchar_t path[16] = L"čaćšžđ\\test.txt";

    std::cout << std::hex << std::setfill('0');
    for (wchar_t wc : path) {
        std::cout << std::setw(4) << static_cast<unsigned>(wc) << ' ';
    }
    std::cout << '\n';
    wchar_t s[16] = L"\u010d\u0061\u0107\u0161\u017e\u0111\\test.txt";

    for (wchar_t wc : s) {
        std::cout << std::setw(4) << static_cast<unsigned>(wc) << ' ';
    }
    std::cout << '\n';
}

问题是我正在将CPP文件保存为ANSI。。。我必须把它转换成UTF-8。我在发布之前尝试过这个,但是VS2015将它转换成了ANSI,我必须在VS中更改它,这样我才能让它工作

我尝试用notepad++打开cpp文件并更改编码,但当我打开VS时,它会自动返回。所以我一直在寻找
另存为
选项,但没有编码选项。最后我在Visual Studio 2015中找到了它

文件->高级保存选项在编码下拉列表中将其更改为Unicode


有一件事对我来说仍然很奇怪,VS是如何正常显示字符的,但是当我在N++中打开文件时,出现了(就像它应该是的那样,因为ANSI)

问题是我正在将CPP文件保存为ANSI。。。我必须把它转换成UTF-8。我在发布之前尝试过这个,但是VS2015将它转换成了ANSI,我必须在VS中更改它,这样我才能让它工作

<