【问题标题】:C#: Remove language specific symbols from stringC#:从字符串中删除特定于语言的符号
【发布时间】:2010-10-20 06:40:35
【问题描述】:

为了这个例子,假设我正在解析一些用德语写的文本。这意味着它包含像 ü 或 Ö 这样的符号。问题在于,当所有德语特定符号都呈现为空方格时。请看这张图片:

Image http://img8.imageshack.us/img8/7502/93341046.png

由于我不知道这个符号是 ü 还是 Ö 我想用“。”替换它。 (点)。所以上图中的字符串应该变成“Osnabr.ck”。我怎么做? 任何帮助将不胜感激!

最好的问候, 基里尔

【问题讨论】:

  • 您能告诉我们您真正想要实现的目标吗?您想确定文本是“Osnabrück”,而不是“OsnabrÖk”或其他什么?

标签: c#


【解决方案1】:

字符串类有一个 Replace 方法。用其他字符替换单个字符是最简单的:

InnerText.Replace("ü", ".");

您可以通过链接 Replace 来同时更改多个字符:

InnerText.Replace("ü", "[ue]").Replace("Ö", "[Oe]");

【讨论】:

  • Regex 在这种情况下应该 (a) 更易于维护并且 (b) 更高效。我怀疑 Ö 和 ü 只是这种情况下的例子。你真的想要链接几十万个 Replace 调用吗?一个你想禁止的每个字符?
  • 显然,替换同样有风险,因为 ju 设法在第二次调用中使用逗号作为替换字符串... ;) 同样替换这些字符根本不起作用,因为字符是实际上不是“Ö”或“ü”。如果是,它们会正确显示。
  • 你不明白这个问题。他想将 ü 与所有其他不可显示且显示为正方形的字符区分开来。 Ö 和 ü 不是示例,实际上只有 ü 是必需的。你没看到他在一个即时窗口中吗?
  • 逗号不是偶然的,都是为了区分不能显示的字符...只是即时窗口的代码...大家没看问题吗?
  • 我不知道您是从哪里获得对问题中未写的问题的更深入理解......它没有说明区分问题中任何地方的字符。跨度>
【解决方案2】:

您可以使用正则表达式来替换您不需要的任何字符。只需将您想要的字符放在否定集中:

str = Regex.Replace(str, "[^0-9A-Za-z _]", ".");

您应该查看用于解码文本的编码。看起来您使用的编码与用于对文本进行编码的编码不同,因为字符显示不正确。

【讨论】:

  • 对于不是数字或字符 A-Z 的每个字符都有一个点就像有一个正方形一样好!这不是解决方案!
  • 嗯,这就是 OP 要求的解决方案。提供问题的实际答案通常比从指出问题中的缺陷开始更容易提出更好的替代方案......
  • 不,他要求去掉正方形,因为他不知道正方形是“ä”还是“ö”。所以把所有的方块都变成点是没有用的。他想把其中一个字符变成一个点。
  • 他想知道它是“Osnabrück”而不是“OsnabrÖck”。所以他只想替换“ü”而不是其他任何东西。这个正则表达式确实替换了所有不可打印的字符,他仍然不知道它是否真的是一个 ü!
  • 请再读一遍这个问题......他想要同样的结果,不管它应该是哪个字符。
【解决方案3】:

如果您想查看实际字符(我注意到您在 Visual Studio 的即时窗口中显示值),您需要使用可以显示字符的字体。正方形的存在意味着您使用的字体不包含与这些字符匹配的字形。您可以在选项对话框中更改 Visual Studio 各个部分使用的字体。

Some more detail in this question here.

【讨论】:

  • 不仅仅是字体,我相信他需要更改默认的文本编码。
  • Windows 上的每种字体都至少支持基本拉丁语,这意味着像 ä 或 ü 这样的变音符号应该可以正常显示。这绝对是编码问题。
  • 我对此表示怀疑。该框仅表示该字体不提供该字符的字形。如果是编码问题,这将倾向于显示为问号或乱码。请阅读我提供的链接
  • 该框是字符不在字体字符集中时显示的内容,最可能的原因是使用了错误的编码,从而将字符解码为不同的字符。
  • 我真的不想对此进行任何争论,但我想说您发现该字符不在字体中的最可能原因是您使用了错误的字体
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多