python - Python unicode 字符串 - 位置
问题描述
我坚持在字符串中获取位置。我读了一个文件的内容
with io.open(testfile, 'r', encoding='utf-8') as f
\u2705 Offizielle Kan\u00e4le \ud83c\udde9\ud83c\uddea \ud83c\udde6\ud83c\uddf9 \ud83c\udde8\ud83c\udded\n@GET_THIS_STING
我该怎么办 - "\u2705" 算作 1 个字母?然后位置 36 将是 @GET_THIS_STING 的开始
--== 编辑 ==-- 我现在可以更好地说明问题所在:
import json
from io import open
line = '{"message":{"message_id":3052,"text":"\u2705 Offizielle Kan\u00e4le \ud83c\udde9\ud83c\uddea \ud83c\udde6\ud83c\uddf9 \ud83c\udde8\ud83c\udded\\n@GET_THIS_STING\\n123456789","entities":[{"offset":36,"length":26,"type":"mention"}]}}'
myjson = json.loads(line)
text = myjson.get("message", {}).get("text", None)
print(str(text).encode('utf-8', 'replace').decode())
print("string length: " + str(len(text)))
print(text[36:36+15])
print("-------------")
with open("/home/pi/telegram/phpLogs/test.txt", 'r', encoding='utf-8', errors="surrogateescape") as f:
for line in f:
myjson = json.loads(line)
text = myjson.get("message", {}).get("text", None)
print(text)
print("string length: " + str(len(text)))
print(text[36:36+15])
结果:
✅ Offizielle Kanäle ???? ???? ????
@GET_THIS_STING
123456789
string length: 61
@GET_THIS_STING
-------------
✅ Offizielle Kanäle
@GET_THIS_STING123456789
string length: 54
HIS_STING123456
因此,当我将代码(UTF-8)中的字符串作为变量(字符串)时,一切正常。但是当我创建一个包含内容的文件并阅读它时
"{"message":{"message_id":3052,"text":"\u2705 Offizielle Kan\u00e4le \ud83c\udde9\ud83c\uddea \ud83c\udde6\ud83c\uddf9 \ud83c\udde8\ud83c\udded\\n@GET_THIS_STING\\n123456789","entities":[{"offset":36,"length":26,"type":"mention"}]}}"
我总是收到“错误”的结果:(所以读取文件是我的问题,因为之后的字符串不一样——甚至长度也不一样!
解决方案
如果此字符串表示✅ Offizielle Kanäle
如@scribe 的答案所建议的那样,那么我认为您遇到了这里提到的问题:Converting to Emoji
因此我建议更换
with io.open(testfile, 'r', encoding='utf-8') as f:
text = f.read() # you didn't show it but probably that's what you have done
和
with open(testfile, 'r', encoding='ascii') as f:
text = json.load(f)
或者,如果文件是“JSON 行”而不是单个 JSON:
with open(testfile, 'r', encoding='ascii') as f:
for line in f:
text = json.loads(line)
然后text
将是一个正确的 Unicode 字符串,所以text[36:]
应该得到你所要求的。
推荐阅读
- amazon-web-services - 如何更改 CloudFormation 模板以更正 s3 容器上的 Access Denied ListObjectV2 操作
- python - 在给定项目结构中的烧瓶应用程序中管理 sqlalchemy 会话的最佳方法是什么?
- ruby-on-rails - Hyperstack 部署问题:没有要加载的文件——models/application_record.rb (LoadError)
- ios - 在所有工作日触发本地 iOS 通知
- javascript - 如果我从 json 文件中获取数据并将其放入 html 表中,如何在 ajax 中使用点击事件
- css - SVG 未在谷歌浏览器中呈现
- java - 构建 android 项目因内部错误而失败
- java - PowerMockito 无法访问私有方法。为什么我们需要权力嘲笑我们可以通过反射实现的同样的事情
- python - 按变量值过滤。.filter(**{filter_name: filter_value}) 是如何工作的?
- gulp - 如何使用 gulp 将版本添加到文件中?