- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在尝试检查给定文件是否存在。正在关注this回答 我试过 GetFileAttributesW
。它适用于任何 ascii 输入,但不适用于 ß、ü 和 á(以及我怀疑的任何其他非 ascii 字符)。我得到 ERROR_FILE_NOT_FOUND
用于文件名和 ERROR_PATH_NOT_FOUND
用于路径名,如果它们不存在,人们会期望。
我 100% 确定他们做到了。我花了 15 分钟来复制文件名以避免拼写错误,并使用文字来避免任何错误的输入。我找不到任何错误。
因为所有这些字符都是非 ascii 字符,所以我停止尝试,因为我怀疑我可能搞砸了编码。我就是看不出来。有什么我想念的吗?我链接到 Kernel32.lib
谢谢!
#include <stdio.h>
#include <iostream>
#include <string>
#include "Windows.h"
void main(){
while(true){
std::wstring file_path;
std::getline(std::wcin, file_path);
DWORD dwAttrib = GetFileAttributesW(file_path.data());
if(dwAttrib == INVALID_FILE_ATTRIBUTES){
printf("error: %d\n", GetLastError());
continue;
}
if(!(dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
printf("valid!\n");
else
printf("invalid!\n");
}
}
最佳答案
要使 Unicode 在 Windows 的控制台程序中很好地工作是非常困难的,所以让我们从删除它的那个方面开始(现在)。
修改你的程序,让它看起来像这样:
#include <cstdio>
#include <iostream>
#include <string>
#include "Windows.h"
int main() {
std::wstring file_path = L"fooß.txt";
DWORD dwAttrib = GetFileAttributesW(file_path.data());
if (dwAttrib == INVALID_FILE_ATTRIBUTES)
printf("error: %d\n", GetLastError());
if (!(dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
printf("valid!\n");
else
printf("invalid!\n");
return 0;
}
即使您使用的是 UTF-8,也请确保使用字节顺序标记 (BOM) 保存此文件。 Windows 应用程序,包括 Visual Studio 和编译器,可能对此非常挑剔。如果您的编辑器不这样做,请使用 Visual Studio 编辑文件,然后使用“另存为”,单击“保存”按钮旁边的向下箭头,选择“使用编码”。在“高级保存选项”对话框中,选择“Unicode(带签名的 UTF-8)- 代码页 65001”。
确保当前文件夹中有一个名为 fooß.txt
的文件。我强烈建议使用 GUI 程序创建此文件,例如记事本或资源管理器。
这个程序有效。如果您仍然收到找不到文件的消息,请检查以确保临时文件在工作目录中或更改程序以使用绝对路径。如果您使用绝对路径,请使用反斜杠并确保它们都已正确转义。检查拼写错误、扩展名等。这段代码确实有效。
现在,如果您从标准输入中获取文件名:
std::wstring file_path;
std::getline(std::wcin, file_path);
然后您在控制台窗口中输入fooß.txt
,您可能会发现它不起作用。如果您查看调试器,您会发现应该是 ß
的字符是其他字符。对我来说,它是 á
,但如果您的控制台代码页是其他东西,它对您来说可能会有所不同。
ß
在 Unicode 中是 U+00DF。在 Windows 1252(美国 Windows 用户最常用的代码页)中,它是 0xDF,因此看起来似乎不可能出现转换问题。但是控制台窗口(默认情况下)使用 OEM 代码页。在美国,常见的 OEM 代码页是 437。因此,当我尝试在控制台中键入 ß
时,它实际上被编码为 0xE1。惊喜!这与 á
的 Unicode 值相同。如果您设法输入一个值为 0xDF 的字符,您将看到它对应于您在原始问题中报告的 block 字符。
您会认为(好吧,我 会认为)从 std::wcin
请求输入会进行任何必要的转换。但事实并非如此,这可能有一些遗留的向后兼容性原因。您可以尝试使用“适当的”代码页来填充流,但这会变得很复杂,而且我从来没有费心去尝试让它工作。我只是停止尝试在控制台上使用 ASCII 以外的任何东西。
关于c++ - GetFileAttributeW 对非 ASCII 字符失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46962348/
双引号的 ASCII 数字是多少? (") 另外,是否有指向任何地方的列表的链接? 最后,如何进入C族(尤其是C#) 最佳答案 引号的 ASCII 码是 34。 (好吧,严格来说,它不是真正的引号,而
考虑一台计算机,它有一个字节可寻址内存,根据大端方案组织成 32 位字。程序读取在键盘上输入的 ASCII 字符并将它们存储在连续的字节位置,从位置 1000 开始。在输入名称“johnson”后显示
\x20 下的大多数 ASCII 代码似乎完全过时了。他们今天有没有使用?它们是否可以被视为“可供抢夺”,还是最好避免它们? 我需要一个分隔符来将“行”分组在一起,为此目的选择其中一个肯定会很好。 来
非字母数字或标点符号的字符称为不可打印: Codes 20hex to 7Ehex, known as the printable characters 那么为什么是例如005 可表示(并由 club
在我的一次面试中,面试官问我为什么在 ASCII 表中大写字母在小写字母之前,我在 google.com 上搜索但没有找到,谁能给我答案?多谢! 最佳答案 我只是猜测,但我想这是因为最早的字符集根本没
由于编码原因可能会让您感到恐惧(我不好意思说),我需要在单个字符串中存储多个文本项。 我将使用一个字符来分隔它们。 哪个字符最适合用于此目的,即哪个字符最不可能出现在文本中?必须是可打印的,并且可能小
我的代码将一大堆文本数据传递给负责存储这些数据的遗留库。但是,它倾向于删除尾随空格。当我读回数据时,这是一个问题。由于我无法更改遗留代码,因此我考虑用一些不常见的 ASCII 字符替换所有空格。当我读
我正在检查井号 (£) 的 ASCII 值。我找到了多个答案: http://www.ascii-code.com/说 A3 = 163 是井号的 ASCII 值。 http://www.asciit
我们好像只用了'\0'(null),'\a'(bell),'\b'(backspace),'\t'(水平制表符),'\n'(line fee) ,'\r'(回车),'\v'(垂直制表符),'\e'(转
当我查看 rust ASCII operations感觉之间存在一致性问题 is_lowercase/is_uppercase: pub fn is_uppercase(&self) -> bool
我一直假设 ASCII 码的范围是 0 到 255。昨晚我不得不处理一个我认为是下划线但结果是 Chr(8230) 的字符。三个类似下划线的小点。这是在 AutoHotKey 脚本中。问题已解决,但给
也许我在使用 Google 方面做得很糟糕,但这些规范适用于 Bencoding继续引用称为“十进制 ASCII”的东西,这让我认为它与常规 ASCII 不同。有人能解释一下吗? 最佳答案 base明
我正在尝试将小字符串转换为它们各自的 ascii 十进制值。就像将字符串“Ag”转换为“065103”一样。 我尝试使用 integer_variable : Integer := Integer'V
我想使用程序或图形库将图像转换为 ASCII 艺术,但我想指定要使用的调色板(符号)。所以基本上我想要一个图像,它从某个字母 A 呈现为文本,它是完整 ASCII 表的子集,例如 A := {a,b,
是否可以使用 Graphviz 绘制 ASCII 图表? 类似的事情: digraph { this -> is this -> a a -> test } 给出了不想要的结果。 相反,我
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
如何将 Žvaigždės aukštybėj užges 或 äüöÖÜÄ 之类的字符串转换为 Zvaigzdes aukstybej uzges 或 auoOUA,分别使用 Bash? 基本上我只
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How would you convert from ASCII to Hex by character i
我有一个成员搜索功能,您可以在其中提供部分姓名,返回的内容应该是至少具有与该输入匹配的用户名、名字或姓氏之一的所有成员。这里的问题是某些名称具有“奇怪”的字符,例如 Renée 中的 é 并且用户不想
我有文件名“abc张.xlsx”,其中包含某种非 ASCII 字符编码,我想删除所有非 ASCII 字符以将其重命名为“abc.xlsx”。 这是我尝试过的: import os import str
我是一名优秀的程序员,十分优秀!