【问题标题】:Force .NET UTF-8 encoder to output 3-byte encoded characters强制 .NET UTF-8 编码器输出 3 字节编码字符
【发布时间】:2020-07-08 06:44:41
【问题描述】:

我正在研究一种显然是在日本开发的外国文件格式。它们的大多数字符串都以 3 字节格式使用 UTF-8 编码存储(即大写字母 A 表示为 0xEF,0xBC,0xA1)。虽然在 .NET 中解码此类字符串没有问题,但我找不到强制框架以相同格式输出的方法,因为它将默认为缩写形式(有道理,但我确实需要 3-字节形式)。

是否有任何标准功能可以解决这个问题?我很懒,我不想自己实现它:)

【问题讨论】:

  • 它已经做到了——这是 UTF8 的 定义,使用 1 个或更多字节来发出 Unicode 字符。 UTF8 是一种可变长度编码。你尝试了什么代码,有什么问题?你期待什么,你得到了什么?
  • @PanagiotisKanavos:它还没有将 A 编码为 EF BC A1。
  • the capital A is represented as 0xEF,0xBC,0xA1 不,不是。这个页面是 UTF8 的,就像现在几乎所有的网站一样。检查源,将其保存到磁盘并检查字节。没有一个英文字符被保存为多个字节
  • @Ry 不应该。那不是 UTF8
  • 你的代码大约是FULLWIDTH LATIN CAPITAL LETTER A。这是写拉丁文字的日本特长。不要将它用作标准的A 字母,但当您需要全角时。因为日文(和中文)字符很大,通常我们将两个拉丁字符放在一个“地方”,但对于某些标题或垂直布局。

标签: c# .net .net-core utf-8 utf


【解决方案1】:

这不是字母'A'。这是一个不同的符文,FULLWIDTH LATIN CAPITAL LETTER A。注意'A' 中的额外间距。

这不是不同的 UTF8 格式,而是不同的字符。制作这种文件的人要么犯了错误,要么故意将这些字形用于布局目的。

如果您想生成类似的文本,您必须首先找到这些字符的使用方式,例如。对于某些单词,每个单词,特定部分?然后你必须修改你自己的文本以匹配它,例如用全角等效替换普通字母。

您可以用String.Normalize 转换此类字符串,使用KC 或KD 规范化形式。例如下面的表达式:

"'AA'".Normalize(System.Text.NormalizationForm.FormKC)

返回:

'AA'

【讨论】:

  • 谢谢,内容丰富。但是:如果它是一个不同的角色,有没有办法反过来转换?即如果我想从标准的“A”到“A”?我尝试了规范化功能,但它们只会从“A”变为“A”,如果我想将一些已编辑的文本写回文件中,这不是我所需要的......
猜你喜欢
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 2011-08-19
  • 2011-04-21
  • 2013-05-11
  • 2020-07-17
  • 2019-11-10
  • 1970-01-01
相关资源
最近更新 更多