Python3でのバイト数カウント(変数内文字)
解決済
回答 4
投稿
- 評価
- クリップ 1
- VIEW 190
PythonとwxPythonモジュールでGUIのプログラミングしているのですが、
# -*- coding: utf-8 -*-
# EasyTweet GUI Version 1.0.0
import wx
import tweepy as tp
import os
import time
# Some Programs...
var1 = input_tweet.GetValue()
text_str_count.SetLabel('バイト数: '+str(len(var1))+"/280")
# Some Programs...
このvar1 = input_tweet.GetValue()
でテキストボックスの中身をvar1へと代入するのですが、var1の中身をバイト数カウントする方法がわかりません。
「b」を付けるやり方も読んだのですが、直接文字列を変数に代入する方法しかサンプルが載っていなく、行き詰まってしまいました。
どうすればいいかを教えていただけるとありがたいです。
よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+2
文字列をバイト列にするのにはstr.encodeを使えば良いかと思います。
>>> 'ほげ'.encode()
b'\xe3\x81\xbb\xe3\x81\x92'
>>> 'hoge'.encode()
b'hoge'
>>> len('ほげ'.encode())
6
>>> len('hoge'.encode())
4
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
もしTwitter、280文字が標準に。日本語は除くに関連する処理であるならば
単純にバイナリ変換したデータ長を見るのではなく、Pythonで、文字列に日本語が含まれているか判定する
などを参考に、1文字ずつCJK文字か判別しながら文字数をカウント(CJK文字なら2、それ以外なら1)文字種に対応するWeight
を決定し、積算すべきと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
コメント欄の流れを見る限り質問内容はバイト数のカウントではなく、ツィッターでの280文字数のチェックですよね。
こういうチェックを行いたい場合は他の人が同じような悩みを抱えているので
1,まず公式ドキュメントtwitter-text parsing updates (英語)を当たる。
2,公式のクライアントまたは頻繁に更新が行われているクライアントのソースコードを確認する。
※ソースコードのライセンスに注意
そうすると以下のコードがHITするのです。
Twitter社のTwitterTextParser.java#parseTweet
とTwitterTextConfiguration.java#TwitterTextWeightedRangeクラス
これをPython言語で頑張って実装しないといけないのです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
check解決した方法
+1
slist = []
for i in input_tweet.GetValue():
slist.append(i)
cnt = 0
for var in slist:
if unicodedata.name(var).find('CJK UNIFIED') != -1 or unicodedata.name(var).find('HIRAGANA') != -1 or unicodedata.name(var).find('KATAKANA') != -1:
cnt = cnt + 2
else:
cnt = cnt + 1
if cnt > 280:
text_str_count.SetLabel('バイト数: '+str(cnt)+"/280 Warning: バイト数をオーバーしています")
else:
text_str_count.SetLabel('バイト数: '+str(cnt)+"/280")
文字列を一文字ずつに区切りたいより引用させていただいたコードとcan110様が提示してくださったPythonで、文字列に日本語が含まれているか判定するで、無事に期待通りに動かすことができました。
ありがとうございました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 91.04%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/01/10 18:44
追加で質問があるのですが、サンプルの場合、Unicode文字をlen()にかけると「あ」で「3」と出ます。
3というのはバイト数だと思うのですが、日本語を2バイトとして読み込むにはどうしたらいいでしょうか。
すみません、よろしくお願いします。
2018/01/10 18:51
Twitterって、結構面白い文字数カウントをしているようですね。単純にバイト数を数えるだけではダメかもしれません。
https://qiita.com/tateren/items/0321beec5d75fdd314f7
2018/01/10 18:58
2018/01/10 19:03