ネイティブに変換したい小さな Web アプリがあります。現在、多くの可動部分 (バックエンド、ブラウザーなど) があり、それを 1 つの緊密なアプリケーションに変換したいと考えています。これを行うために PyGame を使用することにしましたが、フォントのレンダリングの問題を除けば、これまでのところ問題ありません。
表示したい文字列は कोझिकोड です。これは、正しくレンダリングされて次のようになります。
特定のコード ポイントは \u0915 \u094b \u091d \u093f \u0915 \u094b および \u0921 です。
これで、エディターとブラウザーでは問題ないように見えますが、PyGame でレンダリングしようとすると、これが表示されます。基本的に、母音記号 (\u093f ि) は झ の左側にあるはずですが、右側 (および क の左側) に表示されるため、完全に混乱しています。これはブラウザーやテキスト エディター (入力文字列が同じ) では発生しないため、PyGame のレンダラーの問題であると推測しています。
ि (\u093f) を झ (\u091d) の前に置くという、この特定のケースでのみ機能する大まかな修正が 1 つあります。その場合、そうのように適切にレンダリングされます。これは、私が言語についてある程度知っていて、そのロジックをコードに組み込んでいることにかかっています。ここでは複数の言語を扱わなければならないので、それは現実的ではありません。
私はユニコードの経験があまりないので、この問題に取り組む方法がわかりません。これを修正するためにできることはありますか?
念のため、Debian にあり、これをレンダリングするために必要なグリフを備えたfreesansフォントを使用しています。
更新: これを実際にレンダリングするコードは次のとおりです。
# -*- coding: utf-8 -*-
import time
import pygame
# Pygame setup and create root window
pygame.font.init()
screen = pygame.display.set_mode((320, 200))
empty = pygame.Surface((320, 200))
font_file = pygame.font.match_font("freesans") # Select and
font = pygame.font.Font(font_file, 30) # open the font
writing = font.render(u"कोिझकोड कोझिकोड", True, (0, 0, 0)) # Render text on a surface
screen.fill((255, 255, 255)) # Clear the background
screen.blit(writing, (10, 10)) # Blit the text surface on the background
pygame.display.flip() # Refresh the display
input() # Wait for input before quitting
最初の単語は正しくレンダリングされていますが、大雑把な修正で述べたように、母音と文字の位置を反転させてレンダリングしています。2 番目は適切に記述されていますが、正しくレンダリングされていません。
更新 2 : 他に何もないので、外部プログラムを使用して文字列を画像にレンダリングし、この画像を PyGame サーフェスにブリットすることにしました。imagemagick を試してみましたが、これと同じように混乱してしまいます。Gimp は問題なく動作するので、バッチ モードを使用して作業を完了する予定です。