
dart 中的单竖线 `|` 是位或(bitwise or)运算符,语义与 php 完全一致,但 dart 不支持字符串与整数的隐式类型转换,必须显式对整数执行位运算。
在 PHP 中,chr(ord($c1) / 64) | "\xc0" 能够运行,是因为 PHP 会自动将字符串 "\xc0"(即字节值 0xC0)强制转为整数参与位运算;而 Dart 是强类型语言,String 类型不定义 | 运算符,因此直接写 String.fromCharCode(...) | "\xc0" 会编译报错:The operator '|' isn't defined for the type 'String'。
✅ 正确做法是:全程在 int 类型上进行位运算。例如,原始 PHP 表达式:
$cc1 = (chr(ord($c1) / 64) | "\xc0");
其逻辑本质是:
- ord($c1) → 获取字符 ASCII/UTF-8 字节值(整数)
- / 64 → 在 PHP 中是整数除法(注意:PHP / 返回浮点数,但 chr() 会自动截断小数;实际应使用 intval(ord($c1) / 64) 或 ord($c1) >> 6 更准确)
- chr(...) → 转为单字符字符串(如 "\x01")
- | "\xc0" → 隐式将两边转为整数后按位或(即 1 | 192 == 193)
对应 Dart 的推荐写法(安全、高效、语义清晰):
// 假设 c1 是长度为 1 的字符串,如 'A'
final c1 = 'A';
final code = c1.codeUnitAt(0); // 获取 UTF-16 编码单元(ASCII 字符即为 ASCII 值)
final shifted = code ~/ 64; // 使用整数除法(~/),等价于右移 6 位:code >> 6
final cc1Int = shifted | 0xC0; // 位或:0xC0 即十进制 192
print(cc1Int); // 输出:193(若 c1 == 'A',则 ord('A')=65 → 65~/64=1 → 1|192=193)⚠️ 注意事项:
- String.fromCharCode(int) 返回 String,不能直接参与位运算;务必先获取 codeUnitAt(0) 或使用 runes(对 BMP 外字符需谨慎);
- PHP 的 ord() 对单字节字符返回 0–255,Dart 的 codeUnitAt(0) 对 ASCII 字符行为一致,但对 Unicode 补充字符(如 emoji)可能返回代理对,此时应优先用 runes.first 并确保输入为单字符;
- 若最终需要字节形式的字符串(如用于 UTF-8 编码构造),可将结果转为 Uint8List 或用 String.fromCharCodes([cc1Int])(仅当 cc1Int ≤ 0xFFFF 且为有效 Unicode 码点时安全);
- 如需十六进制字符串表示(如调试用),可用 .toRadixString(16).padLeft(2, '0')。
✅ 总结:Dart 的 | 就是 PHP 的 |,差异仅在于类型系统——所有位运算必须作用于整数,禁止跨类型运算。剥离字符串包装、专注数值计算,是迁移此类 PHP 位操作代码的关键原则。










