表意文字space编码

Ideographic space encoding

我想在我们的编码中排除表意文字 space,但它不起作用。

string a = "A B";
var encoder = HtmlEncoder.Create(allowedRanges: new[] { UnicodeRanges.BasicLatin, new UnicodeRange(3000, 1) });

Console.WriteLine(encoder.Encode(a));

输出是

A B

我只希望显示为 space。原因是我在另一个应用程序上发送它,他们希望它按原样接收。

A B

首先,IDEOGRAPHIC SPACE 的代码点是 3000,但它在 hex 中,所以你应该写成:

new UnicodeRange(0x3000, 1)

但是,这不能解决问题。

如果您查看 Createdocumentation 的 "Remarks",您会看到:

Some characters in allowedRanges might still be encoded; that is, this parameter indicates what ranges the encoder is allowed to not encode, not what characters it must not encode.

这很糟糕,不是吗?

如果我们看一下 reference source,我们会看到有一条评论专门说 禁止 某些类别中的所有字符(此构造函数由调用Create):

public DefaultHtmlEncoder(TextEncoderSettings settings)
    {
        if (settings == null)
        {
            throw new ArgumentNullException(nameof(settings));
        }

        _allowedCharacters = settings.GetAllowedCharacters();

        // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed
        // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp)
        _allowedCharacters.ForbidUndefinedCharacters();

我们看到 Zs 中除了 0x20 space 之外的所有字符都是禁止的。由于这是在源代码中编写的,并且在 _allowedCharacters = settings.GetAllowedCharacters(); 行之后,无论您如何更改设置都无法更改行为。

所以总而言之,您不能使用 HtmlEncoder 来执行此操作。你必须使用其他东西。


旧的 WebUtility.HtmlEncode 似乎 编码表意文字 space,但它也不编码其他 spaces...也许这对你有用?