URL 在 C++ 中编码扩展 ASCII std::string
URL Encoding an Extended ASCII std::string in C++
我有一个 std::string
填充了扩展的 ASCII 值(例如 čáě
)。我需要 URL 为 JavaScript 编码这个字符串,以便用 DecodeURIComponent
解码。
我曾尝试将其转换为 UTF-16,然后通过 windows-1252
代码点转换为 UTF-8,但未能成功,因为 MultiByteToWideChar
的示例不足和 WideCharToMultiByte
函数。
我正在 Windows 10 64 位上使用 MSVC-14.0 进行编译。
我怎样才能至少遍历最终 UTF-8 字符串的各个字节以进行 URL 编码?
谢谢
您可以使用MultiByteToWideChar
将字符串转换为UTF-16,然后对字符进行编码。
示例代码:
std::string readData = "Extended ASCII characters (ěščřžýáíé)";
int size = MultiByteToWideChar(
1252, //1252 corresponds with windows-1252 codepoint
0,
readData.c_str(),
-1, //the string is null terminated, no need to pass the length
NULL,
0
);
wchar_t* wchar_cstr = new wchar_t[size];
MultiByteToWideChar(
1252,
0,
readData.c_str(),
-1,
wchar_cstr,
size
);
std::stringstream encodeStream;
for(uint32_t i = 0; i < size; i++){
wchar_t wchar = wchar_cstr[i];
uint16_t val = (uint16_t) wchar;
encodeStream << "%" << std::setfill('0') << std::setw(2) << std::hex << val;
}
delete[] wchar_cstr;
std::string encodedString = encodeStream.str(); // the URL encoded string
虽然这确实编码了基本的 ASCII 字符 (< 128),但它完全可以被 JavaScript 解码,这是最终目标。
我设法用非常简单的代码做到了。
这是一个将 JSON 从文件读取到 URL 并发送到外部网站以显示 JSON 中的语法错误的示例(在 MS/Windows 上测试):
void EncodeJsonFileTextAndSendToExternalWebSiteToShowSyntaxErrors (const std::string &jsonTxt)
{
std::stringstream encodeStream;
for (char c : jsonTxt)
{
if (c>='0' && c<='9' || c>='a' && c<='z' || c>='A' && c<='Z' || strchr("{}();",c))
encodeStream << c;
else
encodeStream << "%" << std::setfill('0') << std::setw(2) << std::hex << (int)c;
}
std::string url = "cmd /c start https://jsonlint.com/?json=" + encodeStream.str();
system(url.c_str());
}
它会自动打开这样的网络浏览器:https://jsonlint.com/?json={%0a%22dataset%20name%22%3a%20%22CIHP%22%0alabel%2017%0a}
我有一个 std::string
填充了扩展的 ASCII 值(例如 čáě
)。我需要 URL 为 JavaScript 编码这个字符串,以便用 DecodeURIComponent
解码。
我曾尝试将其转换为 UTF-16,然后通过 windows-1252
代码点转换为 UTF-8,但未能成功,因为 MultiByteToWideChar
的示例不足和 WideCharToMultiByte
函数。
我正在 Windows 10 64 位上使用 MSVC-14.0 进行编译。
我怎样才能至少遍历最终 UTF-8 字符串的各个字节以进行 URL 编码?
谢谢
您可以使用MultiByteToWideChar
将字符串转换为UTF-16,然后对字符进行编码。
示例代码:
std::string readData = "Extended ASCII characters (ěščřžýáíé)";
int size = MultiByteToWideChar(
1252, //1252 corresponds with windows-1252 codepoint
0,
readData.c_str(),
-1, //the string is null terminated, no need to pass the length
NULL,
0
);
wchar_t* wchar_cstr = new wchar_t[size];
MultiByteToWideChar(
1252,
0,
readData.c_str(),
-1,
wchar_cstr,
size
);
std::stringstream encodeStream;
for(uint32_t i = 0; i < size; i++){
wchar_t wchar = wchar_cstr[i];
uint16_t val = (uint16_t) wchar;
encodeStream << "%" << std::setfill('0') << std::setw(2) << std::hex << val;
}
delete[] wchar_cstr;
std::string encodedString = encodeStream.str(); // the URL encoded string
虽然这确实编码了基本的 ASCII 字符 (< 128),但它完全可以被 JavaScript 解码,这是最终目标。
我设法用非常简单的代码做到了。 这是一个将 JSON 从文件读取到 URL 并发送到外部网站以显示 JSON 中的语法错误的示例(在 MS/Windows 上测试):
void EncodeJsonFileTextAndSendToExternalWebSiteToShowSyntaxErrors (const std::string &jsonTxt)
{
std::stringstream encodeStream;
for (char c : jsonTxt)
{
if (c>='0' && c<='9' || c>='a' && c<='z' || c>='A' && c<='Z' || strchr("{}();",c))
encodeStream << c;
else
encodeStream << "%" << std::setfill('0') << std::setw(2) << std::hex << (int)c;
}
std::string url = "cmd /c start https://jsonlint.com/?json=" + encodeStream.str();
system(url.c_str());
}
它会自动打开这样的网络浏览器:https://jsonlint.com/?json={%0a%22dataset%20name%22%3a%20%22CIHP%22%0alabel%2017%0a}