Как экранировать нестандартные символы в набор символов Windows 1252

У меня есть файл xml с нестандартными символами, и я хотел бы преобразовать их в кодировку Windows 1252, например, &#nnn Я плохо понимаю XSLT, но я пробовал это, помогите, пожалуйста, вот XML и XSLT

<?xml version = "1.0"?>
<xsl:transform xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output method = "xml" omit-xml-declaration = "yes" indent = "yes" encoding = "Windows-1252"/>

  <xsl:template match = "/Recordset">
    <Recordset><xsl:apply-templates /></Recordset>
  </xsl:template>

  <xsl:template match = "*|@*">
    <xsl:copy>
      <xsl:apply-templates select = "@*" />
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
</xsl:transform>

Пример XML для символов

<?xml version = "1.0"?>
<Recordset> 
128 € euro sign
129    NOT USED
130 ‚ single low-9 quotation mark
131 ƒ Latin small letter f with hook
132 „ double low-9 quotation mark
133 … horizontal ellipsis
134 † dagger
135 ‡ double dagger
136 ˆ modifier letter circumflex accent
137 ‰ per mille sign
138 Š Latin capital letter S with caron
139 ‹ single left-pointing angle quotation mark
140 Œ Latin capital ligature OE
141    NOT USED
142 Ž Latin capital letter Z with caron
143    NOT USED
144    NOT USED
145 ‘ left single quotation mark
146 ’ right single quotation mark
147 “ left double quotation mark
148 ” right double quotation mark
149 • bullet
150 – en dash
151 — em dash
152 ˜ small tilde
153 ™ trade mark sign
154 š Latin small letter s with caron
155 › single right-pointing angle quotation mark
156 œ Latin small ligature oe
157    NOT USED
158 ž Latin small letter z with caron
159 Ÿ Latin capital letter Y with diaeresis
160 no-break space 
</Recordset>

XML поддерживает стандарт Unicode, поэтому любой символ Unicode является стандартным символом в XML. Независимо от того, используете ли вы XML с XSLT или каким-либо иным образом, синтаксический анализ входного XML-документа, как вы показали, не представляет проблемы, если XML-документ правильно объявляет свою кодировку в объявлении XML в начале. Однако ваш пример с <?xml version = "1.0"?> этого не делает. Так что напрашивается вопрос? Какова кодировка входного XML-документа?

Martin Honnen 09.04.2019 14:06

@MartinHonnen utf-8 - это ввод XML

Tim 09.04.2019 15:27

Обозначение &#123; в XML всегда представляет символ, кодовая точка Unicode которого равна 123, и никогда не представляет символ, кодировка которого равна 123 в чем-то вроде кодовой страницы Windows-1252. Это верно независимо от кодировки файла XML.

Michael Kay 09.04.2019 16:04

@MichaelKay, приведенное выше, представляет собой xml для наборов символов окна 1252, если это должно быть правильно преобразовано, символы будут представлены &#nnn , что является кодировкой Windows, все, что я пытаюсь сделать, это иметь xslt, подобный приведенному выше, который может распознать это и добавить правильное представление. Обозначение nnn будет состоять из чисел в начале, например, маркера &#149

Tim 09.04.2019 16:51

@ Тим, нет, ты пропустил мою мысль. В XML &#149; представляет собой управляющий символ «ожидание сообщения» (и разрешен только в XML 1.1), независимо от кодировки файла. Пункт пули — &#8226;, опять же, независимо от кодировки файла.

Michael Kay 09.04.2019 18:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
441
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Символы, о которых вы спрашиваете, могут быть представлены в кодировке символов документа, о которой вы спрашиваете. Таким образом, вам не нужно использовать числовые ссылки на символы.

XSLT кажется излишним для изменения кодировки символов документа. Вам нужно прочитать исходный файл XML и записать его снова, используя другую кодировку символов документа. Это приведет к тому, что кодовые точки Unicode, которые не могут быть представлены в выбранной вами кодировке символов, будут сериализованы как ссылки на числовые символы. Нет необходимости в XSLT, и вам нужно будет все это для XSLT. Таким образом, вы можете пропустить шаг XSLT.

Тем не менее, если у вас есть инструмент, который читает файл XML, применяет преобразование и снова записывает его, соблюдая атрибут кодирования xsl:output, вы можете использовать Преобразование личности с соответствующим элементом вывода:

<xsl:stylesheet version = "2.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
    <xsl:output method = "XML" encoding = "Windows-1252" />
    <xsl:template match = "@*|node()">
        <xsl:copy>
            <xsl:apply-templates select = "@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Если вы сделаете это в своем образце документа, вы увидите, что «знак евро 128 евро» действительно закодирован в Windows-1252.

31 32 38 20 80 20 65 75 72 6F 20 73 69 67 

Если вы хотите, чтобы символ € был представлен в виде ссылки на объект с числовым символом, используйте кодировку документа для набора символов, который ее не поддерживает, например, IBM437.

Однако неясно, почему вам нужна кодировка символов документа, отличная от UTF-8. XML-процессор не сможет далеко продвинуться, если он не поддерживает набор символов для XML, то есть Unicode.

Другие вопросы по теме