TypePHP 编译器
https://swoole.com/aot/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.7 KiB
112 lines
2.7 KiB
# Encoding Guide for PHPX Compiler
|
|
|
|
## Problem
|
|
|
|
When using Chinese characters in source code, you may encounter garbled text (乱码) like:
|
|
```
|
|
Win32 Hello World 绋嬪簭
|
|
鏄剧ず娑堟伅妗?..
|
|
```
|
|
|
|
This happens because:
|
|
1. Windows console uses code page 936 (GBK) by default
|
|
2. Source files are saved as UTF-8
|
|
3. The mismatch causes encoding issues
|
|
|
|
## Solution
|
|
|
|
### Option 1: Use English (Recommended) ✅
|
|
|
|
All example files now use English to avoid encoding issues:
|
|
|
|
**Before:**
|
|
```php
|
|
echo "显示消息框...\n";
|
|
```
|
|
|
|
**After:**
|
|
```php
|
|
echo "Showing message box...\n";
|
|
```
|
|
|
|
### Option 2: Set Console to UTF-8
|
|
|
|
If you must use Chinese, set the console code page to UTF-8 before running:
|
|
|
|
```powershell
|
|
chcp 65001
|
|
.\win32_hello.exe
|
|
```
|
|
|
|
Or in your PHP code, set it programmatically:
|
|
|
|
```php
|
|
function main() {
|
|
// Set console to UTF-8
|
|
exec('chcp 65001 > nul');
|
|
|
|
echo "显示消息框...\n";
|
|
}
|
|
```
|
|
|
|
### Option 3: Use Windows API for Unicode
|
|
|
|
For message boxes and Windows GUI, use wide character functions:
|
|
|
|
```cpp
|
|
// In C++ file
|
|
Int php_messagebox(Int hWnd, String text, String caption, Int uType) {
|
|
// Convert UTF-8 to UTF-16 for Windows API
|
|
int wtext_len = MultiByteToWideChar(CP_UTF8, 0, text.data(), -1, NULL, 0);
|
|
wchar_t* wtext = new wchar_t[wtext_len];
|
|
MultiByteToWideChar(CP_UTF8, 0, text.data(), -1, wtext, wtext_len);
|
|
|
|
int wcaption_len = MultiByteToWideChar(CP_UTF8, 0, caption.data(), -1, NULL, 0);
|
|
wchar_t* wcaption = new wchar_t[wcaption_len];
|
|
MultiByteToWideChar(CP_UTF8, 0, caption.data(), -1, wcaption, wcaption_len);
|
|
|
|
int result = MessageBoxW((HWND)hWnd, wtext, wcaption, (UINT)uType);
|
|
|
|
delete[] wtext;
|
|
delete[] wcaption;
|
|
return result;
|
|
}
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Use English for code comments and strings** - Most portable solution
|
|
2. **Save all files as UTF-8 without BOM** - Standard for modern development
|
|
3. **Avoid mixing encodings** - Keep consistency across all files
|
|
4. **Test on target systems** - Different Windows versions may have different defaults
|
|
|
|
## Current Status
|
|
|
|
All files in `examples/win32-hello/` now use English:
|
|
- ✅ hello-win.php
|
|
- ✅ main.php
|
|
- ✅ window.php
|
|
- ✅ cpp-src/winapi.cc
|
|
- ✅ cpp-src/winapi.stub.php
|
|
|
|
Rebuild to see the changes:
|
|
|
|
```powershell
|
|
php bin\compiler.php examples\win32-hello\project.yml
|
|
.\build\win32_hello.exe
|
|
```
|
|
|
|
Expected output:
|
|
```
|
|
========================================
|
|
Win32 Hello World Program
|
|
========================================
|
|
|
|
Showing message box...
|
|
Message box return value: 1
|
|
|
|
Note: To create a full window, you need to implement window procedure and message loop.
|
|
This requires WNDCLASS registration and message pump in C++ layer.
|
|
|
|
Program ended. Press any key to exit...
|
|
```
|
|
|