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

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

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

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

Q&A

解決済

4回答

2372閲覧

Python3でのバイト数カウント(変数内文字)

I_am_4a

総合スコア21

Python 3.x

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

0グッド

1クリップ

投稿2018/01/10 09:34

PythonとwxPythonモジュールでGUIのプログラミングしているのですが、

Python

1 2# -*- coding: utf-8 -*- 3# EasyTweet GUI Version 1.0.0 4import wx 5import tweepy as tp 6import os 7import time 8 9# Some Programs... 10 11var1 = input_tweet.GetValue() 12text_str_count.SetLabel('バイト数: '+str(len(var1))+"/280") 13 14# Some Programs...

このvar1 = input_tweet.GetValue()でテキストボックスの中身をvar1へと代入するのですが、var1の中身をバイト数カウントする方法がわかりません。
「b」を付けるやり方も読んだのですが、直接文字列を変数に代入する方法しかサンプルが載っていなく、行き詰まってしまいました。

どうすればいいかを教えていただけるとありがたいです。
よろしくお願いします。

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

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

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

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

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

guest

回答4

0

コメント欄の流れを見る限り質問内容はバイト数のカウントではなく、ツィッターでの280文字数のチェックですよね。

こういうチェックを行いたい場合は他の人が同じような悩みを抱えているので
1,まず公式ドキュメントtwitter-text parsing updates (英語)を当たる。
2,公式のクライアントまたは頻繁に更新が行われているクライアントのソースコードを確認する。
※ソースコードのライセンスに注意

そうすると以下のコードがHITするのです。
Twitter社のTwitterTextParser.java#parseTweet
TwitterTextConfiguration.java#TwitterTextWeightedRangeクラス
これをPython言語で頑張って実装しないといけないのです。

投稿2018/01/10 12:40

編集2018/01/10 12:42
umyu

総合スコア5846

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

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

0

もしTwitter、280文字が標準に。日本語は除くに関連する処理であるならば
単純にバイナリ変換したデータ長を見るのではなく、Pythonで、文字列に日本語が含まれているか判定する
などを参考に、1文字ずつ~~CJK文字か判別しながら文字数をカウント(CJK文字なら2、それ以外なら1)~~文字種に対応するWeightを決定し、積算すべきと思います。

投稿2018/01/10 09:54

編集2018/01/10 10:01
can110

総合スコア38266

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

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

I_am_4a

2018/01/10 10:06

も、文字種に対応するWeight…!? もしよければ、サンプルコードなど作っていただきたいのですが… お願いできますか…?
I_am_4a

2018/01/10 10:08

あっ、なるほど、なんとなくわかりました! でもなかなか難しいですね…。
can110

2018/01/10 10:11

まともにやると大変だと思います。。。
guest

0

文字列をバイト列にするのにはstr.encodeを使えば良いかと思います。

Python

1>>> 'ほげ'.encode() 2b'\xe3\x81\xbb\xe3\x81\x92' 3>>> 'hoge'.encode() 4b'hoge' 5>>> len('ほげ'.encode()) 66 7>>> len('hoge'.encode()) 84

投稿2018/01/10 09:39

LouiS0616

総合スコア35660

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

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

I_am_4a

2018/01/10 09:44

詳しい説明ありがとうございます。 追加で質問があるのですが、サンプルの場合、Unicode文字をlen()にかけると「あ」で「3」と出ます。 3というのはバイト数だと思うのですが、日本語を2バイトとして読み込むにはどうしたらいいでしょうか。 すみません、よろしくお願いします。
LouiS0616

2018/01/10 09:51

エンコードはデフォルトでUTF-8で行われていますが、例えばShift-JISを指定すると「あ」は2バイトになります。ただし、あくまでもこの場でのエンコードの方法を挿げ替えているだけなので、根本的な解決になっていないようにも思えます。 Twitterって、結構面白い文字数カウントをしているようですね。単純にバイト数を数えるだけではダメかもしれません。 https://qiita.com/tateren/items/0321beec5d75fdd314f7
can110

2018/01/10 09:58

あ~文字種とWeightの対応表が必要なのですね。なんてめんどくさい仕様だw
LouiS0616

2018/01/10 10:03

複雑すぎて私にはお手上げです。
guest

0

自己解決

Python

1slist = [] 2 for i in input_tweet.GetValue(): 3 slist.append(i) 4 cnt = 0 5 for var in slist: 6 if unicodedata.name(var).find('CJK UNIFIED') != -1 or unicodedata.name(var).find('HIRAGANA') != -1 or unicodedata.name(var).find('KATAKANA') != -1: 7 cnt = cnt + 2 8 else: 9 cnt = cnt + 1 10 if cnt > 280: 11 text_str_count.SetLabel('バイト数: '+str(cnt)+"/280 Warning: バイト数をオーバーしています") 12 else: 13 text_str_count.SetLabel('バイト数: '+str(cnt)+"/280")

文字列を一文字ずつに区切りたいより引用させていただいたコードとcan110様が提示してくださったPythonで、文字列に日本語が含まれているか判定するで、無事に期待通りに動かすことができました。
ありがとうございました。

投稿2018/01/10 12:41

I_am_4a

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問