当サイトではアフィリエイト広告を利用しています

【解決した】UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 0-10: ordinal not in range(256)

【解決した】UnicodeEncodeError-'latin-1'-codec-can't-encode-characters-in-position-0-10-ordinal-not-in-range(256)
インフラ担当エラー解決方法
スポンサーリンク

Pythonっていいですよね!初心者でもわかりやすいし、業務自動化もできるし、機械学習だってできちゃう!

しかし、Pythonでコード書いてたら突如「UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 0-14: ordinal not in range(256)」というエラーが!どうしたらいい!

ホームページ・インフラ担当が副業やるってよ!
こんにちは!uri uri(@Uriuri_writer)です。今回はPythonのエラーである「UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 0-14: ordinal not in range(256)」の原因と解決方法にいて解説しています。

当サイトではエラー解決の情報を掲載しています。興味がある方は是非ご覧ください。

PythonのSyntaxErrorとは?エラーの原因と対策方法
Pythonの代表的なエラーの1つ「SyntaxError」について解説していきたいと思います。 あなたがPythonを学び始めたばかりの初心者であろうと、経験豊富な開発者であろうと、SyntaxErrorに遭遇することは避けられません。 ...
【解決】ImportError: cannot import name 'analytics' from partially initialized module 'gradio'が出てStable Diffusion web UI(AUTOMATIC1111版)が使えない!
Stable Diffusionで画像を作りたいのに「ImportError: cannot import name 'analytics' from partially initialized module 'gradio'」というエラー...
スポンサーリンク

エラーの原因

「UnicodeEncodeError: ‘latin-1’ codec can’t encode characters」のエラーは、特定の文字列をエンコードまたはデコードしようとしたときに、その文字列が使用しているコーデック(この場合は’latin-1’)でサポートされていない文字を含んでいる場合に発生します。

このエラーの一般的な原因は以下の通りです

  • ファイルのパスや名前に非ASCII文字が含まれている場合。
  • 画像に追加するテキストに非ASCII文字が含まれている場合。

この問題を解決するための一般的な方法は、文字列のエンコーディングを’utf-8’に変更することです。ただし、このエラーがPillowライブラリの内部で発生する場合、WebPの保存時にエンコーディングを指定することはできません。

つまり、Pillowライブラリのデフォルトのフォントは、日本語である「ひらがな」「カタカナ」「漢字」の文字をサポートしていないということです。だから、エラーが発生します。

解決策

日本語をサポートしているフォントを使うことで解決します。ttfやttcなどをパソコンのフォルダを指定して、パソコン内にあるフォントを使うことで解決します。

実際にコードを使って説明した方がわかりやすいので、コードを書いていきます。

まずは、エラーが実際に発生したコードを書きます。

#画像に指定の文字を書き込むコード(エラーが発生したコード)
import os
import random
from PIL import Image, ImageDraw, ImageFont

def add_text_to_image(image_path, output_path, text):
# 画像を開く
image = Image.open(image_path)

# 描画オブジェクトを作成
draw = ImageDraw.Draw(image)

# フォントの設定 (デフォルトのフォントを使用)
font = ImageFont.load_default()

# 画像のサイズを取得
width, height = image.size

# テキストのサイズを取得
text_width, text_height = draw.textsize(text, font=font)

# テキストの位置を計算 (画像の中央に配置)
x = (width - text_width) / 2
y = (height - text_height) / 2

# テキストを画像に描画
draw.text((x, y), text, font=font, fill="white")

# 画像をWebP形式で保存
image.save(output_path, "WEBP")

def main():
folder_path = "simple"
png_files = [f for f in os.listdir(folder_path) if f.endswith('.png')]

if not png_files:
print("PNGファイルが見つかりませんでした。")
return

# ランダムにPNGファイルを選択
selected_file = random.choice(png_files)
input_path = os.path.join(folder_path, selected_file)

# 出力パスを設定 (同じフォルダ内にWebP形式で保存)
output_path = os.path.join(folder_path, selected_file.replace('.png', '.webp'))

text = "ここにテキストを入れる"
add_text_to_image(input_path, output_path, text)
print(f"{output_path} にテキストを追加しました。")

if __name__ == "__main__":
main()

上記のコードでは日本語の「ひらがな」「カタカナ」「漢字」を画像に書き込むことはできませんでした。

では、解決したコードを下記に記載いたします。

#画像に指定の文字を書き込むコード(解決済み)
import os
import random
from PIL import Image, ImageDraw, ImageFont

def add_text_to_image(image_path, output_path, text, font_path):
# 画像を開く
image = Image.open(image_path)

# 描画オブジェクトを作成
draw = ImageDraw.Draw(image)

# 日本語をサポートするフォントを指定
font = ImageFont.truetype(font_path, 30) # 30はフォントサイズ

# 画像のサイズを取得
width, height = image.size

# テキストのサイズを取得
text_width, text_height = draw.textsize(text, font=font)

# テキストの位置を計算 (画像の中央に配置)
x = (width - text_width) / 2
y = (height - text_height) / 2

# テキストを画像に描画
draw.text((x, y), text, font=font, fill="white")

# 画像をWebP形式で保存
image.save(output_path, "WEBP")

def main():
folder_path = "simple"
png_files = [f for f in os.listdir(folder_path) if f.endswith('.png')]

if not png_files:
print("PNGファイルが見つかりませんでした。")
return

# ランダムにPNGファイルを選択
selected_file = random.choice(png_files)
input_path = os.path.join(folder_path, selected_file)

# 出力パスを設定 (同じフォルダ内にWebP形式で保存)
output_path = os.path.join(folder_path, selected_file.replace('.png', '.webp'))

text = "ひらがなカタカナ漢字" # 日本語のテキスト
font_path = "path_to_your_NotoSansCJKjp-Regular.ttf" # 日本語フォントのパスを指定
add_text_to_image(input_path, output_path, text, font_path)
print(f"{output_path} にテキストを追加しました。")

if __name__ == "__main__":
main()

変数font_pathにパソコンに入っている好きなフォントを設定してあげれば、画像に好きなフォントで文字を書き込むことができます。

以下が完成品です。

ひらがなカタカナ漢字の文字をPythonを使って書き込んだ画像

ひらがなカタカナ漢字の文字をPythonを使って書き込んだ画像

まとめ

「UnicodeEncodeError: ‘latin-1’ codec can’t encode characters」というエラーは、’latin-1’コーデックでサポートされていない文字をエンコードまたはデコードしようとするときに発生します。このエラーは、ファイルのパスや名前、画像に追加するテキストに非ASCII文字が含まれている場合によく見られます。エラーを解決するための方法として、文字列のエンコーディングを’utf-8’に変更することや、日本語をサポートしているフォントを使用することです。

具体的には、Pillowライブラリのデフォルトフォントは日本語の「ひらがな」「カタカナ」「漢字」をサポートしていないため、これらの文字を画像に書き込むとエラーが発生します。解決策として、日本語をサポートしているフォントを指定して使用することで、この問題を回避することができます。

最後に簡単に内容をまとめたいと思います。

簡単まとめ

  • ‘latin-1’コーデックでサポートされていない文字を扱うと「UnicodeEncodeError」が発生する。
  • Pillowライブラリのデフォルトフォントは日本語をサポートしていない。
  • 日本語をサポートしているフォントを使用することでエラーを解決できる。

この記事を気に入っていただけたら、コメントやシェアをしていただけるととても励みになります!これからも、Pythonの疑問や困ったを解決情報を発信していきますので、たまにサイトをチェックしていただけると、とっても嬉しいです(‘ω’)ノ。

SNSのフォローボタンを、ポチってくれるとめっちゃ嬉しいです👍

ではでは、最後までご覧いただきありがとうございました。

ホームページ・インフラ担当が副業やるってよ!

Twitter:@Uriuri_writer

Instagram:@uriuri_writer
Instagram

コメント

タイトルとURLをコピーしました