python3のtkinterで、テキストウィジェットに文章を挿入しようとしたところ、
「ユニコードの基本多言語面(U+0000からU+FFFF)の範囲を超えています。tkinterでは扱いきれません。」といったエラーが出ました。
調べてみると、楓の葉の絵文字が混じっていたため、文章をinsertできなかったようです。
そこで、ある文章に先ほどの範囲を超える特殊文字が含まれていれば取り除き、含まれていなければ何もしない処理を行いたいのですが、どうすれば実現できるでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
過去に似た質問がありました。
python3, 表現できないユニコードを一部無視して処理したい
基本多言語面(BMP)外の文字は空文字に置き換える手法です。
Python
1# BMP外を''に置換するマップ 2import sys 3non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), '') 4 5s = 'これ「????」は絵文字です' 6print(s) 7 8# 置換 9s = s.translate(non_bmp_map) 10print(s)
投稿2018/02/16 08:07
編集2018/02/16 08:24総合スコア38352
0
ベストアンサー
can110さんの回答を拝見して以下を妄想しました。
Python
1# unicode対応のPython3限定なのかも 2def leaveOnlyBMP(s): 3 return "".join(filter(lambda c: c < '\uD800' or '\uDFFF' < c, s))
「dictにしたときメモリーをそこそこ使うかもしれない...」という単なる貧乏根性です。
Python3(?)ではUTF16がstrの表現に用いられいると思いますが、BMP範囲外の文字はサロゲートペア(長さが2の文字列)で表現されていて、それぞれのUTF16文字コードがU+D800~U+DFFFの範囲になるということを利用したものです。
不備ありましたらご容赦を・・・
追記:申し訳ありません。不備がありました。
Python3.6.3 LANG=ja_JP.UTF8でUTF-8のソースコード上にBMP範囲外の文字列リテラルを直接記述して、列挙してみたところ以下のようにサロゲートペアでなく単一の文字として扱われていました。
len('????') == 1
ord('????') == 0x1f40d
このため最初の回答の関数ではNGで次のようにしなくてはなりませんでした。
リスト2
Python
1# BMP範囲外のUNICODE文字が1文字として扱われている場合 2def leaveOnlyBMP(s): 3 return "".join(filter(lambda c: ord(c) < 0x10000, s))
ソースコード上に直接書いたり外部からエンコーディングを指定して文字列を読み込んだ場合など、Python3の環境でサロゲートペアになることがあるのかないのかが自分にはわかってませんが、BMP以外を含めたユニコード全範囲の文字を単一のコードポイントとして扱う能力が今のPythonにはあるようなのでその条件下ではリスト2でないといけないと思いました。
投稿2018/02/16 09:12
編集2018/02/17 02:06総合スコア18404
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
いちおうこういうのは前に見たので紹介しておきます。
Qiita - pythonで絵文字を駆逐する
投稿2018/02/16 07:48
総合スコア35672
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
python
1# BMP外を''に置換するマップ 2import sys 3non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), '') 4 5s = 'これ「????」は絵文字です' 6print(s) 7 8# 置換 9s = s.translate(non_bmp_map) 10print(s) 11 12#結果 13#これ「」は絵文字です
投稿2018/02/17 02:14
総合スコア16
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/17 02:32

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/16 08:17
2018/02/16 08:26
2018/02/17 02:07