检查 UTF-8 是wchar_t还是字符?
Check if UTF-8 is wchar_t or char?
我正在调用zlib APIzipOpen
它从我的C++项目创建一个新的zip文件。函数签名为extern zipFile ZEXPORT zipOpen (const char* pathname, int append)
.
此调用最终调用fopen
以创建文件。但是,此函数不支持宽字符,我想通过发送 UTF-8 格式(由 char* 和 fit 函数签名表示(来修复它,并在fopen
调用之前检查字符串是否包含非 ascii 字符,如果没有,请像以前一样调用fopen
。如果是,则转换为宽字符串 (wchar_t( 并调用_wfopen
。
所以问题是是否有一个 C/C++ API 可以检查 UTF-8 格式的字符串是否包含非 ASCII 字符?
基本上,我正在寻找类似于以下示例中isWide
的函数。 我想知道是使用字符串表示文件名从 Windows api 调用fopen
还是_wfopen
。
std::string toUTF8(std::wstring str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
return converter.to_bytes(str));
}
...
..
.
std::wstring s1 = L"おはよう";
isWide(toUTF8(s1).c_str()); //this should return true.
string s2 = "asdasd";
isWide(s2); //this should return false.
std::wstring s3 = L"asdasd";
isWide(toUTF8(s3)); //this should return false.
for s in s1,s2,s3 do : //pseudo code, please forgive me :-)
if (isWide(toUTF8(s)))
_wfopen(s,L"wb"); // create wide char file
else
fopen(s,"wb"); // create regular name file
和isWide的函数签名:
bool isWide(char * s);
如下面的评论中所述,之前已经提出了类似的问题,但标准 API 没有解决。
谢谢
没有理由检查字符串中是否有任何非 ASCII 字符。如果您知道它是 UTF-8(请注意 ASCII 是有效的 UTF-8(,只需转换它并始终无条件调用_wfopen()
。
这取决于你对"宽"的定义。如果您只想测试是否存在非 ASCII 字符,只需测试高位:
bool isWide(const char * s) {
for (; *s; s++) {
if (*s & 0x80)
return true;
}
return false;
}
您可以单步执行所有字符并检查最高有效位是否为"1"。请参阅:https://de.wikipedia.org/wiki/UTF-8,只有多字节字符设置了该位。
bool isWide(const std::string& string) {
for(auto& c : string)
{
if(c & 0x80) {
return true;
}
}
return false;
}
相关文章:
- HEX值到wchar_t字符(UTF-8)的转换
- 转换特殊字符(UTF-8)
- 在C++中使用 UTF-8 字符串和字符
- 在基于英语的系统上将 UTF-8 路径转换为宽字符会引发异常
- 无法将字符数组转换为包含 utf-8 字符的字符串
- 如何在 Visual C++ 中使用 UTF-8 字符串作为字符*?
- 读取UTF-8文件需要解析字符
- 如何正确处理渲染大小为 >= 2B 的 utf-8 字符?
- C++ UTF-8 瑞典语字符读取为 ASCII
- 如何C++ WCOUT UTF-16 编码的字符数组?
- 检查 UTF-8 是wchar_t还是字符?
- Qt UTF-8 文件到 std::string 添加额外的字符
- 字符的 UTF-8 转换
- C Unicode UTF-8解码字符的问题
- 将转义的 UTF-8 八位字节的字符数组转换为 C++ 的字符串
- 如何在没有wchar_t的情况下在 c++ 中解码/编码 UTF-8 字符
- 如何将 utf 字符转换为 windows-1252?
- 在 Linux 中将 UTF-32 宽字符转换为 UTF-16 宽字符以获取补充平面字符
- C 14:UTF-8/UTF-16与本机字符编码之间的转换
- 从键盘读取 UTF-8 编码的字符