检测文件路径中是否有非ASCII字符
我有一个Unicode字符串,采用UTF-8编码存储文件路径,例如 C:\Users\myUser\Downloads\ü.pdf。我已经确认该字符串在本地文件系统中是正确的文件路径,但由于我将该字符串发送到只支持ASCII的不同进程,因此我需要确定该字符串是否包含任何非ASCII字符。
我该如何做?
检测文件路径中是否有非ASCII字符
我有一个Unicode字符串,采用UTF-8编码存储文件路径,例如 C:\Users\myUser\Downloads\ü.pdf。我已经确认该字符串在本地文件系统中是正确的文件路径,但由于我将该字符串发送到只支持ASCII的不同进程,因此我需要确定该字符串是否包含任何非ASCII字符。
我该如何做?
bool containsOnlyASCII(const std::string& filePath) {
for (auto c: filePath) {
if (static_cast<unsigned char>(c) > 127) {
return false;
}
}
return true;
}
std::string
包含 char
元素。标准并未定义 char
是有符号还是无符号。如果它是有符号的,那么我们可以按照标准规定的方式将其转换为无符号。正如几个评论所建议的,并且由 @CrisLuengo 的答案强调,我们可以迭代字符,查找其中任何一个设置了上位比特位的字符(现场实例):
#include <iostream>
#include <string>
#include <algorithm>
bool isASCII (const std::string& s)
{
return !std::any_of(s.begin(), s.end(), [](char c) {
return static_cast<unsigned char>(c) > 127;
});
}
int main()
{
std::string s1 { "C:\\Users\\myUser\\Downloads\\Hello my friend.pdf" };
std::string s2 { "C:\\Users\\myUser\\Downloads\\ü.pdf" };
std::cout << std::boolalpha << isASCII(s1) << "\n";
std::cout << std::boolalpha << isASCII(s2) << "\n";
}
真
假
return std::all_of(filepath.begin(), filepath.end(), ::isprint);
。 - PaulMcKenzieisprint
函数的行为取决于当前的 C 区域设置。如果有人更改了区域设置,则它将不再检查“可打印ASCII”字符。至少,我会更改函数名称以避免混淆。 - Adrian McCarthybool isASCII = std::all_of(filepath.begin(), filepath.end(), [](char c){ return static_cast<unsigned char>(c) <= 127; });
或者 bool isASCII = !std::any_of(filepath.begin(), filepath.end(), [](char c){ return static_cast<unsigned char>(c) > 127; });
这样的代码。 - Remy Lebeau