【问题标题】:How to convert an accented Unicode string to an ANSI string without accent?如何将带重音的 Unicode 字符串转换为没有重音的 ANSI 字符串?
【发布时间】:2019-02-23 14:33:01
【问题描述】:

我发现WideStringToString() function 可以将 Unicode 字符串转换为 ANSI 字符串。我需要将àèéìòù 之类的字符串转换为aeeiou,因此应删除所有重音符号。我认为可以使用该功能完成,但我应该使用哪个代码页?

【问题讨论】:

  • 您或许可以从 TEncoding.Unicode 转换为 TEncoding.ASCII。后者绝对不会包含任何口音。请参阅TEncoding 的帮助。
  • @RudyVelthuis 除了重音符号可能会被转换为 ? 而不是对应的 ASCII 字符。 TEncoding 不擅长音译
  • @Remy:它似乎适用于我下面示例代码中的重音符号。但显然不适用于像 epsilon 这样的外来字符。当然,这不是谷歌翻译。
  • @UliGerhardt:请注意,接受的答案使用 WideCharToMultiByte,TEncoding 也使用它(在 Windows 上)。

标签: delphi


【解决方案1】:

目前的方法是使用System.SysUtils.TEncoding。一个例子:

function RemoveAccents(const Src: string): string;
var
  Bytes: TBytes;
begin
  Bytes := TEncoding.ASCII.GetBytes(Src);
  Result := TEncoding.ASCII.GetString(Bytes);
end;

procedure Test;
begin
  Writeln(RemoveAccents('Ŧĥε qùíçķ ƀřǭŵņ fôx ǰűmpεď ōvêŗ ţħě łáƶÿ ďơǥ'));
  Writeln(RemoveAccents('àèéìòù'));
end;

由于某些未知原因,无法转换 epsilon (ε),因此输出为:

Th? quick brown fox jump?d over the lazy dog
aeeiou

【讨论】:

  • 我用 NormalizeString 进行了测试,它也没有标准化 ε。我查看了here 看是否符合预期,但我从该图表中看不懂任何内容。
  • @Sertac:我认为它说 epsilon 永远不会组合,即始终是单值代码点。但是,其中有几个看起来像一个 epsilon,所以很混乱。
  • 非常感谢您的建议! Epsilon 不会出现在我的数据中,所以这是一个合适的解决方案!
猜你喜欢
  • 2012-12-16
  • 2011-06-09
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2013-08-21
  • 2016-06-18
相关资源
最近更新 更多