質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1348閲覧

pythonで文字コード(utf-8)でのif文の書き方 

taro373

総合スコア189

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2022/07/20 03:33

ひらがなの“あ”の文字コードは下記のようにutf-8では“e38182”です。

~ $ echo 'あ'|xxd 00000000: e381 820a ....
print('あ'.encode('utf-8'))

とすれば、結果は「b'\xe3\x81\x82'」となりました。

この「b'\xe3\x81\x82'」を用いてif文を書くにはどのように書けば
よいのでしょうか。Unicodeの「'u3042'」ではif文を書き動作しましたが、
utf-8のコードでは“あ”を指定できないのでしょうか。

Unicodeとutf-8の関係はこのページで理解できました。
https://akamist.com/blog/archives/4646

「'u3042'」で指定すればいいんじゃないの?と思われるかもしれませんが
xxdコマンドで文字コードを調べて、その結果でpythonコード中に書いておきたいので
記述する方法はないものかと思い質問しました。

python3

1#!/usr/bin/env python3 2# -*- coding:utf-8 -*- 3 4if 'あ' == '\u3042':  # <== 真になる 5 print('u3042','Match') 6else: 7 print('u3042','Unmatch') 8 9if 'あ' == '\xe3\x81\x82':  # <== 真にならない 10 print('xe3x81x82','Match') 11else: 12 print('xe3x81x82','Unmatch')
~ $ python3 test.py b'\xe3\x81\x82' -------- u3042 Match xe3x81x82 Unmatch

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2022/07/20 04:29 編集

> 「'u3042'」で指定すればいいんじゃないの?と思われるかもしれませんが > xxdコマンドで文字コードを調べて、その結果でpythonコード中に書いておきたい ここがまったく意味がないと感じられるので、なぜそうしたいと考えるような事態になっているのか? を説明した方がいいと思います。 echo 'あ' してUTF-8バイナリ表現を調べてコードしてますが、'あ'はPythonでのコードに書けるわけで、わざわざ二段階余計な手間を掛けています。 'あ'という簡単な例示ではなくて、やろうとしていることを書いた方が解決になると思います。
taro373

2022/07/20 04:28

アドバイスありがとうございます。 手入力で作成したファイルを入力元として、Webページの表示データを作成しています。 このときにコピペして集めたデータもあるので、文字化けしてしまう文字コードが混在することがありました。 基本は「1バイト文字だけのファイル」の仕様です。 文字化けが起きたときに、その部分の文字コードはなに?と調べるためにxxdコマンドを使っています。 問題が起きた文字(文字コード)はなんだろう、と調べたときにutf-8のコードが調べられるので、 python側でこのコードでif文が書けたらと考えました。 以上が背景ですが、単純にutf-8のコードを指定してみたいとう興味本位の思いもあり、 質問させていただきました。
melian

2022/07/20 04:34

まぁ、iconv コマンドで確認してもよいかな、とは思います。 echo -n 'あ' | iconv -t UCS-4 | od -tx1 もしくは Ubuntu Linux には uniutils というパッケージがありますので、それに含まれる uniname というコマンドが便利です。 $ echo -n 'あ' | uniname character byte UTF-32 encoded as glyph name    0 0 003042 E3 81 82 あ HIRAGANA LETTER A
taro373

2022/07/20 04:36

ちなみにdecodeを使えばutf-8の文字コードも指定できました [コード] if 'あ' == b'\xe3\x81\x82'.decode('utf-8'): print('xe3x81x82','Match') else: print('xe3x81x82','Unmatch') [結果] ~ $ python3 test.py xe3x81x82 Match
quickquip

2022/07/20 04:43

Pythonコードの方でファイルがutf-8で読めるなら文字化けはそこにはなくて cat ファイル として あ と出てくるので if s == 'あ': で判定できますよね。
taro373

2022/07/20 05:16

quickquipさん はい、そうなんです python側では処理できていますが、渡した先のWebシステムで文字化けするので その前段階で、文字化けの可能性がある文字が含まれていないかチェックをしようとしていました。
quickquip

2022/07/20 06:48 編集

> 文字化けの可能性がある文字が含まれていないかチェックをしようとしていました 知りたかったのはここです。 ここがまったく伝わってないので質問を編集してくださいとお願いしていたのです。 https://ja.meta.stackoverflow.com/questions/2701/#answer-2702 > python側では処理できていますが、 結局、なぜ 'あ' と書く方向で解決できないのかまったく伝わってません。
taro373

2022/07/20 07:14

quickquipさん  すみません、うまくお伝えできていませんでした 一例を挙げると、『ゼロ幅スペース』(UTF-8 :「E2 80 8B」)を チェックしたいときです。 文字化けした  -> xxdコマンドで原因となる文字コードを特定   -> utf-8で表示された文字コードをpythonでチェックしたい “あ”のような通常の文字であれば、ソースコードに書けますが 『ゼロ幅スペース』の場合は書いてしまうと(たとえコメントを書いていても) わかりにくいと思い、「この文字コードを指定している」と明示しようと 考えた次第です。
quickquip

2022/07/20 07:23

> 『ゼロ幅スペース』の場合は書いてしまうと(たとえコメントを書いていても) > わかりにくいと思い、「この文字コードを指定している」と明示しようと > 考えた次第です。 なるほど! それが質問に書いてあれば無駄なことを考えずに済んだと思います。 文字列の\u表記を使わない理由にはなってませんが、まあ理解は出来ます。
guest

回答2

0

ひらがなの“あ”の文字コードは下記のようにutf-8では“e38182”です

ひらがなの“あ”のutf-8でのバイト表現が“e3 81 82”の3バイトなわけなので、直接には質問にあるとおりの内容を比較すればよくて

if 'あ'.encode('utf-8') == b'\xe3\x81\x82':

でしょう。

投稿2022/07/20 04:44

quickquip

総合スコア11055

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

バイト列を utf-8 としてデコードすれば比較できます

>>> 'あ' == b'\xe3\x81\x82'.decode('utf-8') True

投稿2022/07/20 04:40

編集2022/07/20 04:42
chirimen

総合スコア189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro373

2022/07/20 05:49

話を単純にするためにif文として質問させていただきましたが、 最終的には正規表現の条件の記述でutf-8の文字コードを指定したいと考えていました。 正規表現の条件指定の中に直接decodeは書けないようです。 「b'\xe3\x81\x82'.decode('utf-8')」として “あ” を表現できるので、これを使って 正規表現を書いてみようとしましたが、正規表現の条件部分に変数を使うには 「re.compile」があるようです。 みなさまに教えていただいた方法を組み合わせて、目的が達成できそうです。 ありがとうございました。
melian

2022/07/20 07:37 編集

> taro373さん 先の質問でいいますと、f-strings を使って以下の様に書くとよいかと思います。 a, nn = b'\xe3\x81\x82', b'\xe3\x82\x93' check = re.search(rf"[{a.decode('utf-8')}-{nn.decode('utf-8')}]", str) ※ f-string の内部ではバックスラッシュ文字を使うことができないので一旦変数に入れています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問