【问题标题】:What is the char represented by keycode (15) c#?keycode(15)c#所代表的char是什么?
【发布时间】:2015-06-08 12:28:50
【问题描述】:

我有一个字符串,它是通过视图从使用 EF 的 SQL 数据库中提取的。 字符串示例是“mystring”,长度为 8。 当我将此字符串与“mystring”进行比较时,我得到的是“false”。

我已将字符串转换为(字节)数组:

("mystring").Select(m=>(byte)m).ToArray();

我看到我在数组末尾有一个带有键码“15”的额外字符。

我在任何地方都看过什么是键码“15”,但在键码表中没有看到它。

我的问题是:

  1. “15”表示的char转换为byte时是什么?

  2. 为什么要添加到字符串中? (这是我的用户可以通过管理屏幕更改的字符串)

补充:它不会每次都发生,只有(目前)一个字符串。

编辑:我将该字符串的一部分复制粘贴到即时窗口,以检查长度,我得到 Length = 2

这是字符串:

"a‏".Length 
2

这个字符串在UF8中的GetBytes是:

{byte[4]}
[0]: 97
[1]: 226
[2]: 128
[3]: 143

第二个字符的int值(在我眼里是不存在的)是:

var intvalue = (int)test[1];
8207

更新:现在,当我检查那个“a”字符串上的元素时,我在看到“a&rlm”之前复制粘贴了 --> 它是什么以及如何摆脱它?

【问题讨论】:

  • 看看:asciitable.com。它是shift in(无论是什么意思)或negative acknowledge,具体取决于您的 15 是十进制还是十六进制。
  • 是十进制的,我认为是“移入”但我不知道是什么意思(以及为什么存储在sql中,或者是谁在'路上'添加的)
  • 什么样的SQL才能把数据取出来?以及如何首先保存价值?列是varchar 还是nvarchar?您是在 SQL 服务器上还是在 C# 应用程序中进行转换?除非您的用户正在使用电传打字机,否则这不太可能是有效的提交 - 这很可能是您的用户的恶意尝试,或者某些应用程序与用户的输入交互(Trim all user-input 通常是个好主意字符串,让它们摆脱不可见的字符)。
  • 八进制 15 是回车符,这更有可能在字符串中找到这两者中的任何一个。更有可能是 U+010F ď unicode 字符,当转换为 byte 时,这将导致 15(0F in hex) 的值(因为“上”字节在演员。

标签: c# sql string keycode


【解决方案1】:

.NET 中的char不是byte。您从 stringbyte 数组的转换存在缺陷。

您需要使用GetBytes 来获取您选择的编码中的字节。

【讨论】:

  • 谢谢你是对的,我需要使用 GetBytes,但是这个数组没有缺陷,它显示了按下的键码,而不是那个字符的 Unicode 表示。我的问题是字符串中不存在这个 '15' 键码,它是否为 unicode 对我来说并不重要
  • @Ziv 您已经丢弃了字符串包含的一半字节。因为它只是 ASCII 字符,这可能是 8 个字节的零,但仍然......你扔掉了数据。这就是我所说的“有缺陷”。
  • @ZivWeissman Umm,.NET strings 与键码无关。那是一个完全独立的系统。如果您关心键码而不是字符串,为什么不使用varbinary
  • 添加了该字符串的getbytes(它的结尾)
【解决方案2】:

在 HTML 源代码中查看您的问题中的字符串,它被写为a‏。快速谷歌显示 rlm 是从左到右的标记,即 unicode U+200F (http://en.wikipedia.org/wiki/Right-to-left_mark)。

将此与其他人的观察相结合,即转换为字节仅留下最后一个字节,这解释了为什么您将 0F = 15 作为您的字节数。

这是从哪里来的,有待您调查,但我想它来自原始用户输入(即用户从右到左输入文本)。

【讨论】:

  • 好的,谢谢,现在我该如何摆脱它?替换 ("&rlm","") 不起作用
  • @rlm; 是它的 HTML 实体。您只需要通过任何具有正确值的常规方法创建一个 char 并在替换中使用它。例如Replace("\u200f", "");
【解决方案3】:

您的字符可能不是代码为15 的ASCII 字符,而是值为XX0FUnicode 字符。当您将 unicode 字符转换为 byte 时,您会丢失“高位”字节,因为 unicode 字符是两个字节。

我不知道这如何适用于您的 "mystring" 比较,但我怀疑您正在寻找以一个字符结尾的东西并得到以另一个字符结尾的东西。我不是文化方面的专家,所以也许对文化敏感的搜索比较合适?

请注意,以0F 结尾的任何 unicode 字符将产生15 的值。以下是前 15 个:

010f ď 
020f ȏ 
030f ̏ 
040f Џ 
050f ԏ 
060f ؏ 
070f ܏ 
080f ࠏ 
090f ए 
0a0f ਏ 
0b0f ଏ 
0c0f ఏ 
0d0f ഏ 
0e0f ฏ 
0f0f ༏ 

【讨论】:

  • 我为你的努力投了票,但问题是没有额外的(看到的)字符 - 当我查看调试、即时或 xml 视图时,字符串是“mystring”,或者无论我尝试什么。我在屏幕上没有看到其他字符。我现在做不到,但我会在可以使用“GetBytes”方法时更新
  • 您是否查看了十六进制值以确保它们相同(在将其转换为 byte 之前?您是否尝试过转换为 int 而不是 byte 并查看是否得到结果一样吗?
  • 我现在试试 - 这是字符串:"a‏"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 2017-11-03
  • 1970-01-01
相关资源
最近更新 更多