dart 中的 `|` 是位或(bitwise or)运算符,功能与 php 完全一致,但因 dart 是强类型语言,不支持字符串与整数的隐式转换,需显式对整型操作数使用。
在 PHP 中,$cc1 = (chr(ord($c1) / 64) | "\xc0"); 表面上看似对两个字符串做位或,实则依赖其松散类型系统:chr() 返回单字符字符串,"\xc0" 是字节字符串,PHP 会自动将首字节(即 0xc0)提取为整数,并尝试将左侧字符串的 ASCII 值也转为整数参与运算。这种隐式转换在 Dart 中完全不存在——Dart 要求 | 的左右操作数均为整数类型(如 int),否则编译报错:The operator '|' isn't defined for the type 'String'。
因此,正确迁移的关键是跳过字符串中间表示,直接在整数层面完成位运算。假设 c1 是一个长度为 1 的字符串(如 "A"),原始 PHP 逻辑可拆解为:
int charCode = c1.codeUnitAt(0); int shifted = charCode ~/ 64; // 使用整除 ~/ 避免 double
✅ 正确 Dart 写法(推荐):
int cc1Value = (c1.codeUnitAt(0) ~/ 64) | 0xc0; // cc1Value 是 int 类型,例如输入 'A'(codeUnit=65)→ 65~/64=1 → 1 | 192 = 193
⚠️ 若最终需要字符串结果(如 UTF-8 字节序列或十六进制表示),请明确目标:
String cc1 = String.fromCharCode(cc1Value); // 注意:仅当 cc1Value ∈ [0, 0x10FFFF] 且合法时有效
String cc1Hex = cc1Value.toRadixString(16).padLeft(2, '0'); // 小写两位补零
String cc1Escaped = r'\x' + cc1Value.toRadixString(16).padLeft(2, '0');
? 重要提醒:
总结:Dart 的 | 就是位或,但必须作用于 int。迁移时应剥离字
符串包装,直击数值本质——这是类型安全语言的核心思维转变。