Delphi 2007/2010控制台程序writeln()输出希腊字符乱码如何解决?
问题根源
- Windows系统设置的非Unicode程序默认编码为希腊语ANSI代码页(1253),但控制台默认使用希腊语OEM代码页(737)处理输出内容,两种编码字符映射规则不一致,直接输出就会出现乱码。
- Delphi 2007的
string类型为ANSI字符串,默认按1253编码存储,直接输出到控制台时会被按737解码,字符完全错位。 - Delphi 2010的
string类型为Unicode字符串,默认调用writeln输出时会自动转换为系统ANSI编码(1253),同样会遇到编码不匹配的问题。
修复方案
方案1:代码内修改控制台输出编码(全版本通用,无需修改系统配置)
在程序初始化阶段调用Windows API将控制台输出代码页设置为1253即可,修改后完整代码如下:
program Project5; {$APPTYPE CONSOLE} uses Windows; var errorMes : string; begin // 设置控制台输出代码页为希腊语ANSI编码1253 SetConsoleOutputCP(1253); // Delphi 2010及以上Unicode版本可额外添加下行,确保输入内容编码匹配 // SetConsoleCP(1253); errorMes := 'αβγδεζηθικλμνξοπρστυφχψω'; writeln(errorMes); readln; end.
方案2:修改系统控制台默认编码(无需修改代码)
如果不希望调整程序代码,可通过修改注册表统一修改所有控制台程序的默认编码:
- 按下Win+R输入
regedit启动注册表编辑器 - 定位到路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage - 找到右侧名为
OEMCP的键值,将其数值修改为1253 - 重启系统后生效,所有控制台程序默认使用1253代码页处理输入输出
注意事项
需确认Delphi项目的源码文件保存编码为系统默认ANSI编码(1253),不要手动修改为UTF-8等其他编码,否则字符串常量在编译阶段就会出现编码错误。
内容的提问来源于stack exchange,提问作者jim
相关产品推荐
相关产品推荐

