You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:54:02