直接用[]取字符再转int即可:s[1]得'e'的ASCII码101,但需先检查索引合法性,否则行为未定义。

直接用 [] 取字符再转 int 就行
字符串中某个位置的字符本质就是 char 类型,C++ 里 char 在参与算术运算时会自动提升为 int,所以最简单的方式就是先用下标访问,再强转或让编译器隐式转换。
注意:必须确保索引在合法范围内,否则行为未定义(不是抛异常,是可能读到垃圾值或崩溃)。
std::string s = "hello"; int ascii = (int)s[1]; // 得到 'e' 的 ASCII 码 101- 如果不确定长度,务必先检查:
if (pos - 用
s.at(pos)可以带边界检查(越界抛std::out_of_range),但性能略低,调试阶段可临时替换验证
处理宽字符或 UTF-8 字符串要特别小心
上面的方法只适用于 ASCII 或单字节编码的字符串。如果字符串含中文、emoji 或用了 std::wstring,s[i] 拿到的就不是“用户感知的字符”,而是底层的一个字节或 wchar_t 单元。
- UTF-8 下,一个汉字占 3 个字节,
s[2]可能只是某个汉字的中间字节,转成int没有意义 -
std::wstring中s[0]是wchar_t,其值不等于 ASCII 码(Windows 下通常是 UTF-16,Linux/macOS 下可能是 UTF-32) - 真要处理 Unicode 字符,得用专门库(如 ICU、utf8cpp)解码后再取码点,不能靠裸下标
避免把 char 当 unsigned char 误判符号位
ASCII 码范围是 0–127,没问题;但如果你的字符串里混入了非 ASCII 字节(比如某些 Latin-1 编码文本),char 在部分平台默认是 signed,s[i] 值可能是负数(如 -1 表示 0xFF),直接转 int 会得到负值,而非你想要的 255。
立即学习“C++免费学习笔记(深入)”;
- 安全写法:
int ascii = (unsigned char)s[i]; - 尤其在做协议解析、二进制数据处理时,漏掉这个转换会导致逻辑错误(比如判断
== 0xFF失败) - 编译器一般不会警告,运行时才暴露,容易被忽略
用 static_cast 比 C 风格强转更清晰
虽然 (int)s[i] 能用,但显式类型转换更利于维护和静态检查。
- 推荐写法:
int code = static_cast<int>(static_cast<unsigned char>(s[i]));</unsigned></int> - 两层转换:先升为
unsigned char避免符号扩展,再转int - 如果确定只处理纯 ASCII,一层
static_cast<int>(s[i])</int>也够用,但加unsigned char层是防御性习惯
真正麻烦的从来不是怎么取 ASCII 码,而是没想清楚字符串的编码和索引语义是否匹配——下标对 UTF-8 来说不是“第几个字符”,而是“第几个字节”。这点一旦错,后面全错。


















