当我在终端中运行包含 <?php echo "🚀पीएचपी";
的脚本时,它显示垃圾字符而不是表情符号和外文文本。
具体来说,它显示 ≡ƒÜÇαñ¬αÑÇαñÅαñÜαñ¬αÑÇ
.
但是,运行包含 console.log("🚀पीएचपी")
的 Node.js 脚本正确地将表情符号和外文显示为 🚀पीएचपी
.
如何在使用 PHP 时正确回显/打印表情符号和外文文本,以便它们按预期在 CLI 中显示?
关于如何解决此问题并让 PHP 在终端中正确显示表情符号和 unicode 文本有什么建议吗?
此场景已使用 Windows 终端 (Powershell 7)、cmd 和 GitBash(MINGW64) 终端进行了测试
正在运行chcp
在我的 Windows 终端中返回 65001(即 utf-8)。因此终端本身已正确配置 UTF-8。引用chcp
: https://learn.microsoft.com/en-us/windows/win32/intl/code-page-identifiers?redirectedfrom=MSDN
最小可重现示例:
- 运行
chcp 65001
在 Windows 终端/cmd 中。 - 运行
chcp
再次确保它返回Active code page: 65001
. - 运行下面的 php 脚本(确保在 php.ini 中启用
extension=mbstring
):
<?php
$utf8_string = "🚀पीएचपी";
$detected_encoding = mb_detect_encoding($utf8_string);
echo "Detected encoding[$utf8_string]: " . $detected_encoding;
- 我仍然看到这个显示:
Detected encoding[🚀पीएचपी]: UTF-8
附录: 我正在使用 PHP7.0 。它适用于 PHP 8.2,但不适用于 PHP 7.0
最佳答案
PHP 7.1 引入了许多与 Windows 上的代码页相关的更改(有关详细信息,请参阅 here)。
其中一项更改是调用 php_win32_cp_cli_setup()
在 CLI SAPI 中。
该函数最终调用 SetConsoleOutputCP()
Win32 API 设置与控制台关联的代码页。
代码页根据default_charset
PHP 选项设置。默认情况下,该选项的值为 UTF-8
,
因此代码页设置为 65001
:
C:\Users\Olivier>C:\php\php.exe -r "echo sapi_windows_cp_get();"
65001
如果我在 php.ini 中设置 default_charset = "windows-1252"
,我会得到:
C:\Users\Olivier>C:\php\php.exe -r "echo sapi_windows_cp_get();"
1252
您在评论中提到您正在使用 PHP 7.0。对于该版本,CLI 使用默认 OEM 运行 代码页,这会导致您的编码不匹配。
关于cmd - 使用 PHP 在 CLI/shell/终端中打印表情符号/外来字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76819401/