Ideographi c кодировка пространства - PullRequest
2 голосов
/ 28 апреля 2020

Я хочу исключить иероглиф c пробел в нашей кодировке, но он не работает.

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

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

Вывод

A B

Я ожидаю показать как пробел только. Причина в том, что я отправляю его в другое приложение, и они хотят, чтобы оно получило его как есть.

A B

1 Ответ

3 голосов
/ 28 апреля 2020

Во-первых, код IDEOGRAPHI C SPACE - 3000, но он находится в hex , поэтому вы должны написать:

new UnicodeRange(0x3000, 1)

Однако это не исправит проблема.

Если вы посмотрите на «Замечания» документации для Create, вы увидите:

Некоторые символы в allowedRanges все еще может быть закодирован; то есть этот параметр указывает, какие диапазоны кодировщику разрешено не кодировать, а не какие символы он не должен кодировать.

Это отстой, не так ли?

Если мы имеем Если взглянуть на справочный источник , мы увидим, что есть комментарий, специально говорящий о запрещении всех символов в определенных категориях (этот конструктор вызывается 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, запрещены. Поскольку это написано в исходном коде и после строки _allowedCharacters = settings.GetAllowedCharacters();, вы не можете изменить поведение независимо от того, как вы меняете настройки.

Итак, в заключение, вы не можете использовать HtmlEncoder сделать это. Вам придется использовать что-то еще.


Старый WebUtility.HtmlEncode, кажется, не кодирует идеографический c пробел, но он также не кодирует другие пробелы .. . Может это тебе пригодится?

...