gpt4 book ai didi

c++ - 扩展 ASCII 字符的十进制值

转载 作者:行者123 更新时间:2023-12-02 02:47:21 25 4
gpt4 key购买 nike

我编写了一个函数来测试字符串是否仅由字母组成,并且效果很好:

bool is_all_letters(const char* src) {
while (*src) {
// A-Z, a-z
if ((*src>64 && *src<91) || (*src>96 && *src<123)) {
*src++;
}
else {
return false;
}
}
return true;
}

我的下一步是包含“扩展 ASCII 代码”,我认为这会非常简单,但这就是我遇到麻烦的地方。例如:

std::cout << (unsigned int)'A' // 65          <-- decimal ascii value
std::cout << (unsigned int)'ñ'; // 4294967281 <-- what?

我认为“ñ”的十进制值将是 164,如 www.asciitable.com 上的 ASCII 图表所示。

我的目标是将用户输入限制为仅 ISO 8859-1(拉丁语 1)中的字母。我只使用过单字节字符,并且希望尽可能避免使用多字节字符。

我猜测我可以比较上面的 unsigned int 值,即:4294967281,但它对我来说感觉不对,而且我不知道那个大整数是否是 'ñ' 的 VC 8.0 表示形式并发生了变化从编译器到编译器。

请指教

更新 - 根据 Christophe 提出的一些建议,我运行了以下代码:

locale loc("spanish") ;
cout<<loc.name() << endl; // Spanish_Spain.1252
for (int i = 0; i < 255; i++) {
cout << i << " " << isalpha(i, loc)<< " " << (isprint(i,loc) ? (char)(i):'?') << endl;
}

它确实返回Spanish_Spain.1252,但不幸的是,循环迭代打印与默认C语言环境相同的数据(使用VC++ 8/VS 2005)。

Christophe 显示了不同的(期望的)结果,如下面的屏幕截图所示,但他使用了更新版本的 VC++。

最佳答案

你在网上找到的代码表其实是Windows OEM code page 437 ,从未被认可为标准。尽管它有时被称为“扩展 ASCII”,但这种描述具有很强的误导性。 (参见the Wikipedia article Extended ASCII:“该术语的使用有时会受到批评,因为它可能会被错误地解释为 ASCII 标准已更新为包含超过 128 个字符,或者该术语明确标识了单个编码,这两者都是不真实的”

您可以在维基百科上找到各种版本的 OEM437 历史。

被认可为标准 8 位编码的是 ISO-8859-1 ,后来成为 Unicode 中的前 256 个代码点。 (它是设计用于世界不同地区的一系列 8 位编码之一;ISO-8859-1 指定用于美洲和西欧。)这就是您在本世纪生产的大多数计算机中会发现的。这些地区,尽管最近越来越多的操作系统正在转换为完全 Unicode 支持。

您看到的 (unsigned int)'ñ' 值是从(有符号) 转换 ISO-8859-1 代码 0xF1 的结果char(即 -15)到 unsigned int。如果您将其转换为 int,您会看到 -15。

关于c++ - 扩展 ASCII 字符的十进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25467356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com