C++ 用unicode c+编码路径+;
我在打开UTF-8路径文件时遇到问题。具有UTF-8字符的路径(如西里尔语或拉丁语)。我用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
\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中更改它,这样我才能让它工作
<