【发布时间】:2013-04-01 10:31:58
【问题描述】:
设置如下:
- 创建一个带有 TRichEdit 控件的新 Delphi 7 应用程序。我们在这里讨论的是非 Unicode 应用程序。
- 在 Windows 的区域和语言选项中安装一种新的输入语言,其编码与 default Language for non-Unicode programs 的编码不同 - 例如希腊语。
- 在应用程序中添加一个按钮,并在其
OnClick处理程序中添加Button1.Caption := RichEdit1.Text;,并将其Font.Charset设置为您刚刚安装的输入语言的字符集(如果我们坚持这个示例,则为GREEK_CHARSET)。 -
运行应用程序,切换到新的(希腊语)输入语言,在 RichEdit 中键入几个字母并按下按钮 - 按钮的标题现在有
????符号而不是希腊字符。 现在,如果您将 非 Unicode 程序的默认语言 设置为希腊语(需要重新启动 Windows),这个问题就会消失 - 希腊字符会正确显示。将您的非 Unicode 程序的默认语言设置回原来的状态,问题又出现了。
所以我猜 TRichEdit 在内部使用 Unicode,因为更改其 Font.Charset 值不会改变任何东西 - RichEdit 正确接受任何已安装的输入语言,并且如果您安装了两种使用不同字符集的不同非拉丁语言(例如希腊语 /GREEK_CHARSET/ 和俄语 /RUSSIAN_CHARSET/)它会在不更改其 Font.Charset 的情况下同时接受它们。
我还猜想,当您获得 TRichEdit 的 .Text(或 .Lines[i])值时,它会根据 Windws 的非 Unicode 程序的默认语言将其内部 Unicode 文本转换为 ANSI .
此外,将 .Text 值分配给 WideString 或 UnicodeString 也无法正常工作(文本再次在 ???? 中,而不是正确的字符),不仅是当您将其分配给字符串(AnsiString)。
那么问题来了:
我希望能够根据我选择的字符集而不是系统的非 Unicode 程序的默认语言,将 RichEdit 的文本正确转换为字符串 (ANSI)。我怎样才能做到这一点?我更喜欢不涉及第三方组件的解决方案,但是,当然,如果不可能 - 任何事情都可以。
谢谢!
P.S.:切换到 Delphi 2009 或更高版本不是可接受的解决方案。
【问题讨论】:
标签: delphi delphi-7 richedit input-language