你有UTF-8編碼的數據,不 ASCII,用編碼用十進制數三位數字轉義序列的每個字節。實際文本主要由阿拉伯文寫作組成。
您需要將每個\ddd
序列替換爲相應的字節值,然後解碼爲UTF-8。在Python 3:
utf8_data = bytes([int(data[i + 1:i + 4]) for i in range(0, len(data), 4)])
print(utf8_data.decode('utf8'))
演示:
>>> data = r"\216\173\217\138\217\136\216\167\217\134\032\216\178\216\167\216\173\217\129\032\217\138\216\186\217\138\216\177\032\217\132\217\136\217\134\032\216\172\217\132\216\175\217\135"
>>> utf8_data = bytes([int(data[i + 1:i + 4]) for i in range(0, len(data), 4)])
>>> print(utf8_data.decode('utf8'))
حيوان زاحف يغير لون جلده
谷歌翻譯告訴我這是一個令人毛骨悚然的動物改變其在英語皮膚的顏色。
我們可以以其它方式使用一個基於堆棧的解析器的Lua語法轉換爲JSON:
import re
import json
def lua_to_python(lua_data):
return json.loads(''.join(_convert_lua_to_json_chunks(lua_data)))
def _lua_bytes_to_text(data):
return bytes(
[int(data[i + 1:i + 4]) for i in range(0, len(data), 4)]
).decode('utf8')
def _convert_lua_to_json_chunks(lua_data):
tokens = re.split(br'(["{},])', lua_data)
stack = []
pos_tokens = enumerate(tokens)
for pos, token in pos_tokens:
if b'=' in token:
if not stack:
# top-level key-value, produce JSON object syntax
stack.append('}')
yield '{'
yield '"{}":'.format(token.strip().rstrip(b' =').decode('utf8'))
elif token == b'{':
# array or object?
next_nonws = next(t for t in tokens[pos + 1:] if t.strip())
if b'=' in next_nonws:
stack.append('}')
yield '{'
else:
stack.append(']')
yield '['
elif token == b'}':
yield stack.pop()
elif token == b'"':
yield '"'
for pos, s in pos_tokens:
if s == b'"':
yield '"'
break
yield _lua_bytes_to_text(s)
else:
yield token.decode('utf8')
yield from stack
,並在最後兩個額外}
人物,您的數據,那麼產生:
>>> lua_to_python(lua_data)
{'clues': [{'answer': ['ح', 'ر', 'ب', 'ا', 'ء'], 'text': 'حيوان زاحف يغير لون جلده', 'syllables': [['ح', 'ر'], ['ب', 'ا'], ['ء']]}]}
>>> pprint(lua_to_python(lua_data))
{'clues': [{'answer': ['ح', 'ر', 'ب', 'ا', 'ء'],
'syllables': [['ح', 'ر'], ['ب', 'ا'], ['ء']],
'text': 'حيوان زاحف يغير لون جلده'}]}
這應該爲您提供充足的選項來進一步處理數據。
可能會在每個斜槓上拆分字符串,然後將單個數字字符串轉換爲整數,然後轉換爲字符。那麼您可以檢查該值是否低於127以過濾非ASCII字符。 – Wietlol
'ascii-encoded'是什麼意思?您不能同時使用包含非ASCII字符的ASCII編碼*和*,然後您需要忽略(由於定義中正確的ASCII編碼數據不能包含非ASCII編碼的數據)。你的意思是你需要*解碼數字轉義序列*或許? –
根據我下面的回答,你沒有ASCII兼容的數據,你有阿拉伯文本。你確定*你想從這裏消除所有非ASCII數據嗎?你最終會得到空的琴絃。如果您必須*仍*刪除非ASCII數據,請參閱下面的答案和[用一個空格替換非ASCII字符](// stackoverflow.com/q/20078816)。 –