检测文件路径中是否存在任何非ASCII字符
我有一个带有UTF-8编码的Unicode字符串,用于存储文件路径,例如 C:\ Users \ myUser \ Downloads \ü.pdf。我已经检查过该字符串在本地文件系统中保存了正确的文件路径,但由于我将此字符串发送到仅支持ASCII的其他进程,因此需要确定该字符串是否包含任何非ASCII字符。
我该怎么做?
答案 0 :(得分:4)
ASCII字符仅使用char
的低7位(值0-127)。以UTF-8编码的非ASCII Unicode字符使用char
个元素,这些元素都设置了高位。因此,您可以简单地迭代char
元素,看看它们中是否有任何值大于127,例如:
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
是signed
还是unsigned
。如果它是signed
,那么我们可以以明确定义的方式将其投射到unsigned
。该标准确切地说明了这是如何完成的。
答案 1 :(得分:0)
正如@CrisLuengo回答强调的几条评论所暗示的那样,我们可以迭代在高位集(live example)中查找任何字符的字符:
#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";
}
是真的
假