Отображение китайских символов в таблице [дубликат]

Давайте начнем с начала и исследователя немного глубже:

Итак, у вас есть два списка:

list_1=['01','98']
list_2=[['01','98']]

И мы должны скопируйте оба списка, начиная с первого списка:

Итак, сначала попробуем общий метод копирования:

copy=list_1

Теперь, если вы думаете, что копия скопировала список_1, вы можете Неправильно, давайте проверим:

The id() function shows us that both variables point to the same list object, i.e. they share this object.
print(id(copy))
print(id(list_1))

output:

4329485320
4329485320

Удивлен? Итак, давайте рассмотрим это:

Итак, поскольку мы знаем, что python ничего не хранит в переменной, переменные просто ссылаются на объект и объект хранят значение. Здесь object list, но мы создали две ссылки на тот же объект двумя разными именами переменных. Таким образом, обе переменные указывают на один и тот же объект:

, поэтому, когда вы делаете copy=list_1, что на самом деле его делает:

Здесь в изображении list_1 и copy находятся два имени переменной, но объект одинаковый для обеих переменных, который является list

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

copy[0]="modify"

print(copy)
print(list_1)

output:

['modify', '98']
['modify', '98']

Так что он изменил Исходный список:

Что такое решение?

Решение:

Теперь перейдем ко второму питоническому методу копирования списка :

copy_1=list_1[:]

Теперь этот метод исправить то, с чем мы столкнулись в первом выпуске, давайте проверим его:

print(id(copy_1))
print(id(list_1))

4338792136
4338791432

Итак, мы можем видеть, что оба наших списка имеют разные id и это означает, что обе переменные указывают на разные объекты, так что здесь происходит следующее:

N ow давайте попробуем изменить список и посмотрим, остаемся ли мы перед предыдущей проблемой:

copy_1[0]="modify"

print(list_1)
print(copy_1)

Выход:

['01', '98']
['modify', '98']

Итак, вы можете видеть, что он не изменяет первоначальный список, он только изменил скопированный список, поэтому с нами все в порядке.

Итак, теперь я думаю, что мы закончили? подождите, мы должны скопировать второй вложенный список, так что давайте попробуем pythonic way:

copy_2=list_2[:]

Итак, list_2 должен ссылаться на другой объект, который является копией list_2, давайте проверим:

print(id((list_2)),id(copy_2))

получаем результат:

4330403592 4330403528

Теперь мы можем предположить, что оба списка указывают на другой объект, поэтому теперь давайте попробуем его модифицировать и посмотрим, что он дает то, что мы хотим:

Поэтому, когда мы пытаемся:

copy_2[0][1]="modify"

print(list_2,copy_2)

, он дает нам вывод:

[['01', 'modify']] [['01', 'modify']]

Теперь, это немного запутывает, мы использовали питоновский путь, и все же мы сталкиваемся с той же проблемой .

давайте поймем это:

Итак, когда мы делаем:

copy_2=list_2[:]

, мы фактически копируем только внешний список, а не вложенный список, поэтому вложенный list - тот же объект для обоих списков, давайте проверим:

print(id(copy_2[0]))
print(id(list_2[0]))

output:

4329485832
4329485832

Так что, фактически, когда мы делаем copy_2=list_2[:], это происходит:

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

Итак, каково решение?

Решение - deep copy

from copy import deepcopy
deep=deepcopy(list_2)

Итак, теперь давайте проверим:

print(id((list_2)),id(deep))

вывод:

4322146056 4322148040

оба идентификатора разные, теперь давайте проверим идентификатор вложенного списка:

print(id(deep[0]))
print(id(list_2[0]))

output:

4322145992
4322145800

Как вы можете видеть, оба идентификатора различны, поэтому мы можем предположить, что оба вложенных списка теперь указывают на другой объект.

So когда вы делаете deep=deepcopy(list_2), что на самом деле происходит:

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

Теперь попробуем изменить вложенный список и посмотрим, разрешила ли он предыдущую проблему или нет:

, так что если мы это сделаем:

deep[0][1]="modify"
print(list_2,deep)

вывод:

[['01', '98']] [['01', 'modify']]

Итак, вы можете видеть, что он не изменил исходный вложенный список, он только изменил скопированный список.

Если вам понравился мой подробный ответ, сообщите мне об этом, если вы сомневаетесь в этом ответе, прокомментируйте:)

2
задан hippietrail 8 September 2014 в 05:25
поделиться

2 ответа

Есть 3 примера XML Worker , в которых участвуют азиатские языки на официальном веб-сайте iText. Они анализируют файл XHTML, содержащий китайские символы, но его легко адаптировать к вьетнамским примерам.

Вы можете найти файлы HTML, которые будут разбираться здесь:

Оба файла содержат следующий текст:

< blockquote>

長空 (Сломанный меч), ​​秦王 殘劍 (Летающий снег), 飛雪 (Луна), 如月 (Царь) и 秦王 (Небо).

В в первом случае шрифт определяется с помощью CSS:

<span style="font-size:12.0pt; font-family:MS Mincho">長空</span>

Во втором случае определенный шрифт не определен:

<body><p>長空 (Broken Sword), 秦王殘劍 (Flying Snow), 飛雪 (Moon), 如月 (the King), and 秦王 (Sky).</p></body>

Эти файлы содержат символы UTF-8, поэтому мы будем разбирать их следующим образом:

XMLWorkerHelper.getInstance().parseXHtml(writer, document,
            new FileInputStream(HTML), Charset.forName("UTF-8"));

Первое, что вам нужно, это шрифт, который поддерживает вьетнамские символы. Это то, что iText не может вам помочь. В вашем HTML-файле вы определили Helvetica, но это стандартный шрифт Type1, который никогда не встраивается при использовании iText и не знает, как рисовать вьетнамские глифы. Это никогда не сработает.

В первом примере D07_ParseHtmlAsian автоматически будет искать шрифт с именем MS Mincho. Если он находит этот шрифт (например, потому что у вас msmincho.ttc в вашем каталоге шрифтов Windows), шрифт будет отображаться в вашем PDF-файле. См. hero.pdf . Если он не найдет шрифт с этим именем, то глифы не будут видны, потому что вы не предоставили никакой программы шрифтов для этих глифов.

Второй пример D07bis_ParseHtmlAsian предлагает обходное решение, если у вас нет MS Mincho в любом месте. В этом случае вы должны использовать XMLWorkerFontProvider и зарегистрировать шрифт, который можно использовать вместо MS Mincho. Например: мы используем шрифт, хранящийся в файле cfmingeb.ttf, и назначаем псевдоним MS Mincho:

XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.register("resources/fonts/cfmingeb.ttf", "MS Mincho");

Полученный файл asian.pdf немного отличается от того, что мы ожидаем, но теперь мы можем хотя бы увидеть китайские глифы.

В третьем примере HTML-файл ничего не говорит нам о шрифте, который необходимо использовать. Мы определим шрифт с помощью CSS следующим образом:

CSSResolver cssResolver = new StyleAttrCSSResolver();
CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream("body {font-family:tsc fming s tt}".getBytes()));
cssResolver.addCss(cssFile);

Теперь весь текст в теле будет использовать шрифт TSC FMing S TT (сохраненный в файле cfmingeb.ttf). Вы можете увидеть разницу в полученном PDF asian2.pdf .

2
ответ дан Bruno Lowagie 21 August 2018 в 07:14
поделиться
  • 1
    Привет, Бруно, спасибо за ваш ответ. Тем не менее, я использовал BaseFont для решения этой проблемы BaseFont bf = BaseFont.createFont (pdfArialFont, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); . Где, pdfArialFont - это файл ttf, который я помещал в рабочий каталог. – Chi Nguyen 4 March 2014 в 04:13
  • 2
    Это решение помогает отображать не только вьетнамский, но и бирманский язык и многое другое. Благодарим вас за разработку этого фантастического iText: D – Chi Nguyen 4 March 2014 в 04:18

Я думаю, вам нужна кодировка как UTF-8 для вашего HTML и использовать & amp; #xUNUM; для hex или #NUM; для обычного кода для встраивания ваших специальных символов. Не уверен, где, но где-то в вашей программе, так как он не отображается, но ваш окончательный HTML должен быть:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML LEVEL 1//EN">
<HTML>
  <HEAD>
    <TITLE>Your Page Title</TITLE>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
  </HEAD>
  <BODY>
    <!-- YOUR CONTENT HERE -->

     <td fontfamily="Helvetica" fontstyle="0" fontsize="9" 
         align="0" colspan="48" 
        lineoccupied="1">T&#x1ED5; ch&#x1EE9;c tham gia</td>

  </BODY>
</HTML>

Вы можете вырезать и вставить выше в файл HTML и просмотреть результат. Больше удовольствия для чтения здесь Юникод и HTML

0
ответ дан TA Nguyen 21 August 2018 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: