首页 > 解决方案 > 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"}]}}"

我总是收到“错误”的结果:(所以读取文件是我的问题,因为之后的字符串不一样——甚至长度也不一样!

标签: pythonunicodeencodingpositionsubstring

解决方案


如果此字符串表示✅ 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:]应该得到你所要求的。


推荐阅读