首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在哪里可以找到MSIL字符串常量中的转义字符列表?

在哪里可以找到MSIL字符串常量中的转义字符列表?
EN

Stack Overflow用户
提问于 2012-02-02 21:48:25
回答 1查看 1.1K关注 0票数 19

我已经编写了一个程序(用C#)来读取和操作从C#程序生成的MSIL程序。我错误地认为MSIL字符串常量的语法规则与C#的语法规则相同,但后来我遇到了以下情况:

此C#语句

代码语言:javascript
复制
string s = "Do you wish to send anyway?";

编译成(和其他MSIL语句一起)这个

代码语言:javascript
复制
IL_0128:  ldstr      "Do you wish to send anyway\?"

我没想到会出现用来转义问号的反斜杠。现在,我显然可以将这个反斜杠作为处理的一部分,但主要是出于好奇,我想知道当C#编译器将C#常量字符串转换为MSIL常量字符串时,是否有一个列表将哪些字符转义。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-02 22:03:02

更新

基于使用C#编译器+ildasm.exe的实验:可能没有转义字符列表的原因是因为转义字符太少:准确地说是6个。

从ildasm生成的IL,到Visual Studio2010编译的C#程序

传统空格字符严格转义为ASCII.

  • Three
  • \t:0x09:(tab)
  • \n:0x0A:(newline)
  • \r:0x0D:(
    • return)

:(

  • IL是严格转义的

问题将转义三个标点符号:

  • \":0x22:(
    • :0x3F:(问题mark)
    • \\:0x5C:(backslash)

  • 在文字字符串0x20 - 0x7E中仅原封不动地包含以下字符,(不包括三个标点符号和其他字符,包括0x20以下的ASCII控制字符和0x7F以上的所有字符)转换为字节数组。或者更确切地说,包含除上面的92个文字字符和6个转义字符之外的任何字符的任何字符串都被转换为字节数组,其中字节是UTF-16字符串的little-endian字节。

示例1: 0x7E以上的ASCII :简单重音符号(U+00E9)

C#:"é""\u00E9"变为(E9字节在前)

代码语言:javascript
复制
ldstr      bytearray (E9 00 )

示例2: U+2211-16:求和符号∑(UTF)

C#:"∑""\u2211"变为(11字节在前)

代码语言:javascript
复制
ldstr      bytearray (11 22 )

示例3: UTF-32:Double-struck mathematical (U+1D538)

C#:""或UTF-16代理项对"\uD835\uDD38"变为(字符内的字节颠倒,但双字节字符按整体顺序排列)

代码语言:javascript
复制
ldstr      bytearray (35 D8 38 DD )

示例4:字节数组转换适用于包含非Ascii字符的整个字符串

C#:"In the last decade, the German word \"über\" has come to be used frequently in colloquial English."变成了

代码语言:javascript
复制
ldstr      bytearray (49 00 6E 00 20 00 74 00 68 00 65 00 20 00 6C 00  
                      61 00 73 00 74 00 20 00 64 00 65 00 63 00 61 00  
                      64 00 65 00 2C 00 20 00 74 00 68 00 65 00 20 00  
                      47 00 65 00 72 00 6D 00 61 00 6E 00 20 00 77 00  
                      6F 00 72 00 64 00 20 00 22 00 FC 00 62 00 65 00  
                      72 00 22 00 20 00 68 00 61 00 73 00 20 00 63 00  
                      6F 00 6D 00 65 00 20 00 74 00 6F 00 20 00 62 00  
                      65 00 20 00 75 00 73 00 65 00 64 00 20 00 66 00  
                      72 00 65 00 71 00 75 00 65 00 6E 00 74 00 6C 00  
                      79 00 20 00 69 00 6E 00 20 00 63 00 6F 00 6C 00  
                      6C 00 6F 00 71 00 75 00 69 00 61 00 6C 00 20 00  
                      45 00 6E 00 67 00 6C 00 69 00 73 00 68 00 2E 00 )

直接说"you‘t“(查找MSIL字符串转义列表),但这里有一些有用的花边新闻...

包含CIL的严格定义的ECMA-335并没有指定哪些字符必须在QSTRING文本中转义,只指定它们可以使用反斜杠\字符进行转义。最重要的注意事项是:

  • Unicode文本表示为octals,而不是十六进制(即\042,而不是\u0022).
  • Strings可以使用\字符跨多行进行扩展--请参阅下面的

唯一明确提到的转义是制表符\t、换行符\n八进制数字转义。这对您来说有点麻烦,因为C#没有八进制文字--您必须自己进行提取和转换,比如使用Convert.ToInt32([string], 8)方法。

除此之外,转义的选择对于规范中描述的“假设的IL汇编器”来说是“特定于实现的”。所以你的问题正确地问到了MSIL的规则,这是微软对CIL的严格实现。据我所知,MS还没有记录他们的逃生选择。至少问问Mono的人他们用的是什么是有帮助的。除此之外,可能还需要自己生成列表--编写一个程序,为每个字符\u0000声明一个字符串文字--不管是什么,看看编译后的ldstr语句是什么。如果我先找到它,我一定会发布我的结果。

补充说明:

要正确解析*IL字符串文字--称为QSTRINGS或SQSTRINGS --您需要考虑的不仅仅是字符转义。以代码内字符串连接为例(这是Partition II::5.2中的原文):

"+“运算符可用于连接字符串文字。这样,通过使用"+“并在每一行上添加一个新字符串,可以将一个长字符串分成多行。另一种方法是使用"\“作为行中的最后一个字符,在这种情况下,该字符及其后面的换行符不会输入到生成的字符串中。忽略"\“和下一行第一个非空白字符之间的任何空白字符(空格、换行符、回车符和制表符)。注意:要在QSTRING中包含双引号字符,请使用八进制转义序列。结束音符

示例:以下字符串的结果相当于"Hello World from CIL!":

代码语言:javascript
复制
ldstr "Hello " + "World " + "from CIL!"

ldstr "Hello World\ 
       \040from CIL!"
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9113440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档