Отображение знака евро в PDF с использованием XSLT 1.0

Обзор: *Необходимо отобразить знак € в формате pdf*

Я использую класс XslCompiledTransform .Net framework (4.0) для выполнения XSLT. В XSL используется семейство шрифтов Times New Roman. Я использую FO.Net в качестве процессора XSL-FO.

Я пытаюсь отобразить знак евро (€), который является частью моего входного XML. Однако в моем выходном PDF-файле вместо знака € отображается €.

<CurrencySymbol>
€
</CurrencySymbol>

Вот некоторые из соответствующих разделов моего XSL-файла:

<?xml version="1.0" encoding="iso-8859-15"?>

Я пытался использовать &#8364; и &#x20AC;, но если я использую их, вообще ничего не отображается.

eg: <xsl:value-of select="'&#x20AC;'"/>

Спасибо за любую помощь и ваше время! Пожалуйста, дайте мне знать, если потребуется какая-либо дополнительная информация.


person m27    schedule 02.03.2012    source источник
comment
Какой FO-процессор вы используете?   -  person Daniel Haley    schedule 02.03.2012
comment
Похоже, что в ISO-8859-15 символ евро равен 0xA4, поэтому, если это ваша выходная кодировка, вы можете попробовать поставить ¤ вместо €.   -  person Pawel    schedule 06.03.2012
comment
@Pawel: Использование &#xA4; не поможет. Это другой персонаж. Ссылки на числовые символы относятся к кодовым точкам Unicode, которые не зависят от кодировки.   -  person mzjn    schedule 07.03.2012
comment
@questionask - ты прав. Я попробовал следующее, и это сработало для меня: ‹?xml version=1.0 encoding=utf-16?› ‹xsl:stylesheet version=1.0 xmlns:xsl=w3.org/1999/XSL/Transform› ‹xsl:output method=xml indent=yes encoding=iso-8859-15/› ‹xsl:соответствие шаблону =/› ‹Currency›€‹/Currency› ‹/xsl:template› ‹/xsl:stylesheet› Работало, если сам файл xslt был закодирован как ISO-8859-15, utf-8 и utf-16 (я проверил вывод с помощью двоичного редактора). Вы уверены, что в вашем xslt кодировка вывода установлена ​​правильно? Кодировка в заголовке xml предназначена для самого xslt.   -  person Pawel    schedule 08.03.2012
comment
а не файл, созданный этим xslt.   -  person Pawel    schedule 08.03.2012


Ответы (1)


Я столкнулся с той же проблемой. Проблема жестко запрограммирована в FONET.DLL. В классе TrueTypeFont метод MapCharacter записывается так:

public override ushort MapCharacter(char c) 
{
    if (c > Byte.MaxValue) 
        return (ushort) FirstChar;
    return mapping.MapCharacter(c);
}

Таким образом, любой символ со значением больше 255 будет «игнорирован». Я скачал исходники (из https://fonet.codeplex.com/) и изменил метод следующим образом:

public override ushort MapCharacter(char c) 
{
    return mapping.MapCharacter(c);
}

Используя эту библиотеку с этим новым методом, символ евро волшебным образом стал видимым!

person Martin Mulder    schedule 14.01.2016
comment
Абсолютно ничего не помогло, кроме этого решения. Над этим кодом был комментарий: Шрифты TrueType поддерживают только блоки Basic и Extended Latin. Так что я не уверен, может ли это создать какие-то другие проблемы. - person ibram; 11.07.2019