開發者發現同樣的整數 `120`,在 PHP 與 Java 中轉為字符結果截然不同:
但提問者稱 PHP 給出 `MTIw`,這實際上是 `base64_encode(chr(120))` 或其他編碼後的結果,而非直接轉換。
| 特性 | PHP `chr()` | Java `(char)` 強制轉型 |
|---|---|---|
| 輸入範圍 | 0-255 (單位元組) | 0-65535 (UTF-16 碼元) |
| 編碼語義 | 返回對應 ASCII/擴展 ASCII 字符的位元組字串 | 返回對應 Unicode 碼點的字符 |
| 多位元組字符 | 不支援,需用 `mb_chr()` (PHP 7.2+) | 原生支援 BMP 範圍字符 |
| 120 結果 | 位元組 `0x78` → 字串 `"x"` | 字符 `U+0078` → `'x'` |
`MTIw` 是 `"120"` 經 Base64 編碼後的結果:
base64_encode("120") === "MTIw"
推測提問者實際執行了類似 `base64_encode(chr(120))` 或誤將整數轉字串後編碼的操作,而非單純 `chr(120)`。
若需與 PHP `chr()` 完全一致(返回單位元組),Java 應輸出 `byte` 而非 `char`:
// PHP: chr(120) 返回長度為 1 的字串,內容為 byte 0x78
// Java 對等操作:
byte b = (byte) 120; // 0x78
byte[] bytes = new byte[]{b};
String phpStyleResult = new String(bytes, StandardCharsets.ISO_8859_1); // 單位元組編碼
// 或直接用於位元組流輸出
關鍵點:Java `char` 是 UTF-16 碼元(2 位元組),PHP `chr()` 返回單位元組字串。跨語言交互時,務必明確指定編碼(如 ISO-8859-1 或 UTF-8)進行位元組↔字符轉換,不可直接對應 `char` 與 `chr()` 結果。