首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP 與 Java 整數轉字符差異深度解析:chr() vs 強制轉型

     編輯:程式設計綜合問答

現象重現

開發者發現同樣的整數 `120`,在 PHP 與 Java 中轉為字符結果截然不同:

  • PHP: `chr(120)` → `'x'` (ASCII 120)
  • Java: `(char)120` → `'x'` (Unicode 碼點 120)

但提問者稱 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`?

`MTIw` 是 `"120"` 經 Base64 編碼後的結果:

base64_encode("120") === "MTIw"

推測提問者實際執行了類似 `base64_encode(chr(120))` 或誤將整數轉字串後編碼的操作,而非單純 `chr(120)`。

如何在 Java 獲得 PHP `chr()` 相同位元組結果?

若需與 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()` 結果。

總結

  • PHP `chr(int)`:解析為單位元組值,返回單位元組字串(Latin-1 範圍)。
  • Java `(char)int`:解析為 Unicode 碼點,返回 UTF-16 字符。
  • 跨語言一致性:統一使用位元組陣列 + 明確編碼傳輸,避免隱式字符轉換陷阱。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved