如何将ASCII转义码作为字符串字面量处理而非转译为对应字符
核心原因
你遇到的问题和Encoding无关,是C#编译器在编译阶段就会自动解析字符串字面值中的转义序列:你代码里写的"ABC\x30XYZ"在编译完成后,\x30就已经被替换成了对应的ASCII字符0,运行时拿到的字符串本身就是ABC0XYZ,自然不可能直接输出原义的转义序列。
解决方案分两种场景
场景1:代码中直接定义字符串,希望保留转义序列原义
有两种简单写法可以让编译器不自动解析转义:
- 加
@前缀使用逐字字符串:
// 逐字字符串会忽略所有转义序列,直接保留字面值 var value = @"ABC\x30XYZ"; Console.Write(value); // 输出:ABC\x30XYZ
- 手动转义反斜杠:
// 两个反斜杠编译后会变成一个普通反斜杠,让编译器不把后续的x30识别为转义序列 var value = "ABC\\x30XYZ"; Console.Write(value); // 输出:ABC\x30XYZ
场景2:运行时拿到已经被转义的字符串,需要输出其原义转义表示
如果字符串本身已经是转义后的结果(比如编译时处理过、或者从其他转义后的数据源拿到),可以自己实现转换方法,把字符还原为对应的转义序列写法:
using System; using System.Text; public static class StringExtensions { public static string ToLiteral(this string input) { StringBuilder literal = new StringBuilder(input.Length * 2); foreach (char c in input) { switch (c) { case '\'': literal.Append(@"\'"); break; case '\"': literal.Append("\\\""); break; case '\\': literal.Append(@"\\"); break; case '\0': literal.Append(@"\0"); break; case '\a': literal.Append(@"\a"); break; case '\b': literal.Append(@"\b"); break; case '\f': literal.Append(@"\f"); break; case '\n': literal.Append(@"\n"); break; case '\r': literal.Append(@"\r"); break; case '\t': literal.Append(@"\t"); break; case '\v': literal.Append(@"\v"); break; default: // 可打印ASCII字符直接输出,其他字符输出\x格式的转义 if (c >= 0x20 && c <= 0x7E) { literal.Append(c); } else { literal.AppendFormat(@"\x{0:X2}", (int)c); } break; } } return literal.ToString(); } } // 调用示例 var value = "ABC\x30XYZ"; Console.Write(value.ToLiteral()); // 输出:ABC\x30XYZ
补充说明:如果字符串是运行时从外部读取的(比如文本文件、用户输入、接口响应),默认不会被自动转义,只要你没有主动调用转义处理方法,直接输出就是原义内容。
内容的提问来源于stack exchange,提问作者devklick
相关产品推荐
相关产品推荐

