第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 Python 中將寬字符轉(zhuǎn)換為系統(tǒng) ANSI 編碼

在 Python 中將寬字符轉(zhuǎn)換為系統(tǒng) ANSI 編碼

RISEBY 2022-06-28 17:12:13
我目前正在努力讓我的屏幕閱讀器與Becky 一起更好地工作!互聯(lián)網(wǎng)郵件。我面臨的問題與那里的列表視圖有關(guān)。此控件不支持 Unicode,但項(xiàng)目是在屏幕上自定義繪制的,因此當(dāng)有人查看它時(shí),無論編碼如何,所有字段的內(nèi)容看起來都不錯(cuò)。當(dāng)通過 MSAA 或 UIA 訪問時(shí),基本 ANSI 字符和使用非 Unicode 程序設(shè)置的代碼頁編碼的郵件具有正確的文本,而以 Unicode 編碼的郵件則不能。文本示例:黃鵝自己表示為:Za?????,?? g????l?... ja???? 在這種情況下,它已損壞 CP1250,如下面的回答。然而:??表示為: a? ????表示為:a?°,高生旺表示為:é??”??—?我剛剛假設(shè)這些字符串已損壞無法修復(fù),但是當(dāng) Windows 10 中的 unicode beta 支持啟用時(shí),它們會(huì)正確暴露。是否可以在 Python 中模擬這種行為?該解決方案需要同時(shí)在 Python 2 和 3 中工作。目前,我只是簡(jiǎn)單地將這些字符的已知組合替換為它們的正確表示,但這不是很好的解決方案,因?yàn)榘鎿Q和要替換的字符的列表需要使用每個(gè)新發(fā)現(xiàn)的字符進(jìn)行更新。
查看完整描述

1 回答

?
墨色風(fēng)雨

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊

您的 utf-8 被解碼為 cp1250。


我在 python3 中所做的是:


orig = "Za?ó?? g??l? ja?ń"

wrong = "Za???????? g????l?… ja????"


for enc in range(437, 1300):

    try:

        res = orig.encode().decode(f"cp{enc}")

        if res == wrong:

            print('FOUND', res, enc)

    except:

        pass

...結(jié)果是 1250 代碼頁。


所以你的解決方案應(yīng)該是:


import sys


def restore(garbaged):

    # python 3

    if sys.version_info.major > 2:

        return garbaged.encode('cp1250').decode()

    # python 2

    else:

        # is it a string

        try:

            return garbaged.decode('utf-8').encode('cp1250')

        # or is it unicode

        except UnicodeEncodeError:

            return garbaged.encode('cp1250')

編輯:


"高生旺"無法恢復(fù)的原因é??”??—?:


"高生旺".encode('utf-8')是b'\xe9\xab\x98\xe7\x94\x9f\xe6\x97\xba'。


問題是\x98部分。在 cp1250 中,該值沒有字符集。如果你試試這個(gè):


"高生旺".encode('utf-8').decode('cp1250')

你會(huì)得到這個(gè)錯(cuò)誤:UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 2: character maps to <undefined>


獲取方式"é??”??—?"為:


"高生旺".encode('utf-8').decode('cp1250', 'ignore')

但是這ignore部分很關(guān)鍵,它會(huì)導(dǎo)致數(shù)據(jù)丟失:


'é??”??—?'.encode('cp1250')是b'\xe9\xab\xe7\x94\x9f\xe6\x97\xba'。


如果你比較這兩個(gè):


b'\xe9\xab\xe7\x94\x9f\xe6\x97\xba'

b'\xe9\xab\x98\xe7\x94\x9f\xe6\x97\xba'

您會(huì)看到該\x98字符丟失,因此當(dāng)您嘗試恢復(fù)原始內(nèi)容時(shí),您會(huì)得到一個(gè)UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 0-1: invalid continuation byte.


如果你試試這個(gè):


'é??”??—?'.encode('cp1250').decode('utf-8', 'backslashreplace')


結(jié)果將是'\\xe9\\xab生旺'。\xe9\xab\x98可以解碼為高,從\xe9\xab它是不可能的。


查看完整回答
反對(duì) 回復(fù) 2022-06-28
  • 1 回答
  • 0 關(guān)注
  • 335 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)