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");
其逻辑本质是:
($c1) → 获取字符 ASCII/UTF-8 字节值(整数)对应 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)⚠️ 注意事项:
✅ 总结:Dart 的 | 就是 PHP 的 |,差异仅在于类型系统——所有位运算必须作用于整数,禁止跨类型运算。剥离字符串包装、专注数值计算,是迁移此类 PHP 位操作代码的关键原则。