Encoding 为什么有些角色会变成这样?而其他人则成为☐;(␇;)在编码到代码页时? 短版

Encoding 为什么有些角色会变成这样?而其他人则成为☐;(␇;)在编码到代码页时? 短版,encoding,character-encoding,Encoding,Character Encoding,地图绘制者有时使用的原因是什么?其他时间使用☐? Unicode: €‚„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ In 850: ?'".┼╬^%S<OZ''""☐--~Ts>ozY ^\_____________/^\_______/ | | | | | best fit | best fit | |

地图绘制者有时使用的原因是什么?其他时间使用☐?

Unicode:  €‚„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ
In 850:   ?'".┼╬^%S<OZ''""☐--~Ts>ozY
          ^\_____________/^\_______/
          |       |       |    |  
          |    best fit   |  best fit
          |               |
       replacement     replacement
怎么回事

为什么有时候它是个问号,有时候是个问号␇?

注意:缺乏映射对我来说并不十分重要。如果联邦政府不支持合理的编码,那么他们会接受我给他们的垃圾。所以我没意见

当我尝试调用
MultiByteToWideChar
来反转映射时,出现了一个问题,该函数由于无效字符而失败。虽然我可以试着在以后找出反向编码回字符的问题;我很好奇编码映射器试图告诉我什么

额外乐趣
细心的观察者会理解我为什么选择角色,按照我选择的顺序,以及为什么会有空白。我不想提及这一点,以免混淆读者的问题。

答案既微妙又显而易见

执行映射时,编码器尝试执行最佳拟合。因此,虽然目标代码页中不存在很多字符;它们可以很好地近似

有些字符没有任何等价的映射,也没有任何最佳匹配映射,因此只需替换为

  • U+0037问号
因此,案文:

The price of petrol is € 1.56 in Germany.
不幸的是:

The price of petrol is ? 1.56 in Germany.
问号意味着这个角色没有对等物,只是丢失了

另一个角色更微妙 在ASCII中,前32个字符是控制字符,例如

  • 13:回车(␍)
  • 10:线路馈电(␊)
  • 9:水平选项卡(␉)
  • 11:垂直选项卡(␋)
  • 7:贝尔(␇)
  • 27:逃跑(␛)
  • 30:记录分隔符(␞)
这些控制代码通常无法打印。但代码页437做了一些独特的事情:它们为前32个代码定义了字符:

  • 13:第八注(♪)
  • 10:反向白圈(◙)
  • 9:白色圆圈(○)
  • 11:男性标志(♂)
  • 7:项目符号(•)
  • 27:直角(∟)
  • 30:黑色指向三角形(▲)
如果您有一些文本,例如:

汽油价格␍␊
•德国:1.56欧元␍␊
•法国:1.49欧元

当在代码页850中编码时,变为:

汽油价格♪◙• 德国:?1.56♪◙• 法国:1.49欧元

注意三件事:

  • 符号丢失;替换为
  • 保留了
    符号
  • CR
    LF
    符号丢失;替换为
试图将代码页437/850解码回真实字符会出现问题:

  • 如果我想保留CRLF,我必须假设1..32范围内的字符实际上是ASCII控制字符

    汽油价格␍␊
    ␇ 德国:1.56欧元␍␊
    ␇ 法国:1.49欧元

  • 如果我想保留我的字符(如¨,•,§),我必须永久丢失我的CRLF,并且假设1..32中的字符实际上是字符:

    汽油价格♪◙• 德国:1.56欧元♪◙• 法国:1.49欧元

没有好办法摆脱这一切

理想情况下,代码页437不会对代码页中的前32个字符执行此操作,并保留控制字符。理想情况下,任何试图将文本转换为437的人:

•在德国,汽油价格为1.56欧元♪哀歌♪

会带着

在德国,汽油的价格是1.56英镑?悲伤的歌

但437代码页并非如此

这是一个可怕的烂摊子;在那里你必须拿起毒药慢慢死去

安息吧,迈克尔·卡普兰 这个答案是由“☼" (,又称带光线的白色太阳)
作为glyph chars系列的骄傲成员,西雅图已经见证了比太阳还要多的岁月


请参阅Michael Kaplan的(注意:cpXXX中32以下的代码不是ASCII字符,因此0x07不是U+0007 BELL。您是否询问最佳匹配的基本原理?根据文档,您可以更改“未知字符”,但为什么.NET将一个未知(目标集)字符编码为另一个具有最佳匹配的字符是为了实现者
The price of petrol is € 1.56 in Germany.
The price of petrol is ? 1.56 in Germany.