යුනිකෝඩ් එන්කෝඩ් දෝෂය: 'ascii' කෝඩෙක්ට 20 වන ස්ථානයේ u '\ xa0' අක්ෂරය සංකේතනය කළ නොහැක: ඕඩිනල් පරාසය තුළ නොමැත (128)


1313

විවිධ වෙබ් පිටු වලින් (විවිධ වෙබ් අඩවි වලින්) ලබාගත් පෙළෙන් යුනිකෝඩ් අක්ෂර සමඟ කටයුතු කිරීමේදී මට ගැටළු තිබේ. මම භාවිතා කරන්නේ BeautifulSoup.

ගැටළුව වන්නේ දෝෂය සෑම විටම ප්රජනනය කළ නොහැකි වීමයි; එය සමහර විට සමහර පිටු සමඟ ක්‍රියා කරන අතර සමහර විට එය විසි කිරීමෙන් බාධා කරයි UnicodeEncodeError. මට සිතිය හැකි සෑම දෙයක් ගැනම මම උත්සාහ කර ඇත්තෙමි, නමුත් යම් ආකාරයක යුනිකෝඩ් සම්බන්ධ දෝෂයක් නොතකා නිරන්තරයෙන් ක්‍රියාත්මක වන කිසිවක් මට හමු වී නැත.

ගැටළු ඇති කරන කේතයේ එක් කොටසක් පහත දැක්වේ:

agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()

ඉහත ස්නිපටය ක්‍රියාත්මක වන විට සමහර නූල් මත නිපදවන තොග හෝඩුවාවක් මෙන්න:

Traceback (most recent call last):
  File "foobar.py", line 792, in <module>
    p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

සමහර පිටු (හෝ වඩාත් නිශ්චිතවම, සමහර වෙබ් අඩවි වල පිටු) කේතනය කර ඇති අතර අනෙක් ඒවා කේතනය කර නොමැති නිසා විය හැකි යැයි මම සැක කරමි. සියලුම වෙබ් අඩවි එක්සත් රාජධානියේ පිහිටා ඇති අතර එක්සත් රාජධානියේ පරිභෝජනය සඳහා අවශ්‍ය දත්ත සපයයි - එබැවින් ඉංග්‍රීසිකරණය හැර වෙනත් කිසිම දෙයකින් ලියා ඇති පෙළ සමඟ අභ්‍යන්තරකරණය හෝ ගනුදෙනු කිරීම සම්බන්ධ ගැටළු නොමැත.

මට මෙම ගැටලුව නිරාකරණය කර ගැනීමට හැකි වන පරිදි මෙය විසඳන්නේ කෙසේද යන්න පිළිබඳව යමෙකුට අදහසක් තිබේද?


1
ඔබ මෙම දෝෂයන් සංවර්ධකයෙකු ලෙස නොව පරිශීලකයෙකු ලෙස ලබා ගන්නේ නම්, serverfault.com/questions/54591/… සහ askubuntu.com/questions/599808/…
එම බ්‍රසීලියානු ගයි

මම මේ කාරණය එකතු කරමි onlinegdb.com/online_python_interpreter මෙම දේවල් සඳහා භාවිතා නොකරන්න . අත්හදා බැලීමේ දේවල් සඳහා එම පරිවර්තකය භාවිතා කරමින් සිටි අතර එය යුනිකෝඩ් සඳහා නිවැරදිව වින්‍යාස කර නොමැත! සෑම විටම මුද්‍රණය කළේ 'බී' n nnn 'ආකෘතියෙනි ... මට අවශ්‍ය වූයේ ගිලට් එකක් පමණි! වීඑම් එකක් මත උත්සාහ කළ අතර එය
chr

4
මෙය උත්සාහ කරන්න import os; import locale; os.environ["PYTHONIOENCODING"] = "utf-8"; myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8"); ... print(myText.encode('utf-8', errors='ignore')).
hhh

Shhh මම ඔබේ ස්නිපටය ධාවනය කළෙමි NameError: 'myText' යන නම අර්ථ දක්වා නැත
KHAN irfan

11
ඔබේ පිටපත ක්‍රියාත්මක කිරීමට පෙර ෂෙල් එකේ PYTHONIOENCODING සැකසීමට උත්සාහ කරන්න :$ export PYTHONIOENCODING=utf8
Noam Manos

Answers:


1382

ඔබ පයිතන් යුනිකෝඩ් HOWTO කියවිය යුතුය . මෙම දෝෂය පළමු උදාහරණයයි .

මූලික වශයෙන්, strයුනිකෝඩ් සිට කේතනය කළ පෙළ / බයිට් බවට පරිවර්තනය කිරීම භාවිතා කිරීම නවත්වන්න .

ඒ වෙනුවට, .encode()නූල කේතනය කිරීමට නිසි ලෙස භාවිතා කරන්න:

p.agent_info = u' '.join((agent_contact, agent_telno)).encode('utf-8').strip()

හෝ සම්පූර්ණයෙන්ම යුනිකෝඩ් වලින් වැඩ කරන්න.


24
එකඟ විය! මට උගන්වන ලද හොඳ රීතියක් නම් “යුනිකෝඩ් සැන්ඩ්විච්” අදහස භාවිතා කිරීමයි. ඔබගේ ස්ක්‍රිප්ට් එක බාහිර ලෝකයෙන් බයිට් පිළිගනී, නමුත් සියලු සැකසුම් යුනිකෝඩ් වලින් කළ යුතුය. ඔබේ දත්ත ප්‍රතිදානය කිරීමට ඔබ සූදානම් වූ විට පමණක් එය නැවත බයිට් වලට එකතු කළ යුතුය!
ඇන්ඩබ්ඩෘ

257
වෙනත් අයෙකු මෙයින් ව්‍යාකූලත්වයට පත්වුවහොත්, මට අමුතු දෙයක් හමු විය: මගේ පර්යන්තය utf-8 භාවිතා කරන අතර, printමගේ utf-8 නූල් භාවිතා කරන විට එය මනාව ක්‍රියාත්මක වේ. කෙසේ වෙතත්, මම මගේ වැඩසටහන් ප්‍රතිදානය ගොනුවකට නල කරන විට, එය විසි කරයි UnicodeEncodeError. ඇත්ත වශයෙන්ම, ප්රතිදාන (ගොනුව හෝ නල) හරවා විට, මම ඒ සොයා sys.stdout.encodingයනු None! ගැටගැසීම .encode('utf-8')ගැටළුව විසඳයි.
ඩ්‍රෙවිකෝ

93
redrevicko: PYTHONIOENCODING=utf-8ඒ වෙනුවට භාවිතා කරන්න, එනම් යුනිකෝඩ් නූල් මුද්‍රණය කර අපේක්ෂිත කේතන ක්‍රමය සැකසීමට පරිසරයට ඉඩ දෙන්න.
jfs

1
@steinar: සෑම අවස්ථාවකම කිසිවක් වලංගු නොවේ. පොදුවේ ගත් කල, ඔබේ උපයෝගීතාව ක්‍රියාත්මක කිරීම සඳහා ඔබ පයිතන් භාවිතා කිරීම ගැන පරිශීලකයෙකු නොසැලකිය යුතුය (කුමන හේතුවක් නිසා හෝ එය වෙනත් භාෂාවකින් නැවත ප්‍රතිස්ථාපනය කිරීමට ඔබ තීරණය කරන්නේ නම් අතුරු මුහුණත වෙනස් නොවිය යුතුය) එබැවින් එම පරිශීලකයා පයිතන් ගැන පවා දැනුවත් යැයි ඔබ අපේක්ෂා නොකළ යුතුය. විශේෂිත පරිසරය. අක්ෂර කේතීකරණය නියම කිරීමට පරිශීලකයාට බල කිරීම නරක UI ය; අවශ්‍ය නම් අක්ෂර කේතීකරණය වාර්තා ආකෘතියට ඇතුළත් කරන්න. සටහන: සාමාන්‍ය නඩුවේ කිසිදු දෘ c කේතීකරණයක් “සංවේදී පෙරනිමි” විය නොහැක.
jfs

13
මෙය නරක හා ව්‍යාකූල උපදෙස් ය. මිනිසුන් str භාවිතා කිරීමට හේතුව වස්තුව දැනටමත් නූලක් නොවන නිසා .encode()ඇමතීමට ක්‍රමයක් නොමැත .
සෙරින්

437

මෙය සම්භාව්‍ය පයිතන් යුනිකෝඩ් වේදනා ලක්ෂ්‍යයකි! පහත සඳහන් කරුණු සලකා බලන්න:

a = u'bats\u00E0'
print a
 => batsà

මේ දක්වා සියල්ල හොඳයි, නමුත් අපි str (a) ලෙස හැඳින්වුවහොත්, සිදුවන්නේ කුමක්දැයි බලමු:

str(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)

ඔහ් ඩිප්, ඒක කාටවත් හොඳක් කරන්නේ නැහැ! දෝෂය නිවැරදි කිරීම සඳහා, .encode සමඟ බයිට් පැහැදිලිව කේතනය කර පයිතන්ට කුමන කෝඩෙක් භාවිතා කළ යුතු දැයි කියන්න:

a.encode('utf-8')
 => 'bats\xc3\xa0'
print a.encode('utf-8')
 => batsà

Voil \ u00E0!

ගැටළුව වන්නේ ඔබ str () අමතන විට, ඔබ විසින් ලබා දුන් බයිට් උත්සාහ කිරීමට සහ කේතනය කිරීමට පයිතන් පෙරනිමි අක්ෂර කේතන ක්‍රමය භාවිතා කරන අතර ඔබේ නඩුවේ සමහර විට යුනිකෝඩ් අක්ෂර නිරූපණය වේ. ගැටළුව නිරාකරණය කිරීම සඳහා .encode ('any_unicode') භාවිතා කරමින් ඔබ එය ලබා දෙන නූල සමඟ කටයුතු කරන්නේ කෙසේදැයි පයිතන්ට පැවසිය යුතුය. බොහෝ විට, ඔබ utf-8 භාවිතා කරමින් හොඳින් සිටිය යුතුය.

මෙම මාතෘකාව පිළිබඳ විශිෂ්ට ප්‍රදර්ශනයක් සඳහා, නෙඩ් බැට්චෙල්ඩර්ගේ පයිකොන් කතාව මෙතැනින් බලන්න: http://nedbatchelder.com/text/unipain.html


86
පුද්ගලික සටහන: ".encode" ටයිප් කිරීමට උත්සාහ කරන විට අහම්බෙන් ".unicode" ටයිප් නොකරන්න, එවිට කිසිවක් ක්‍රියා නොකරන්නේ මන්දැයි කල්පනා කරන්න.
හෆ්මන් මඟහරින්න

10
හොඳ උපදෙස්. නූල් විය හැකි හෝ නොවිය හැකි වස්තූන් මුද්‍රණය කිරීම සඳහා ඔබ str (x) භාවිතා කරන විට ඒ වෙනුවට ඔබ කරන්නේ කුමක්ද? x යනු අංකයක්, දිනය වේලාව, බූලියන් හෝ සාමාන්‍ය නූලක් නම් str (x) ක්‍රියා කරයි. හදිසියේම එය යුනිකෝඩයක් නම් එය ක්‍රියා විරහිත වේ. එකම හැසිරීම ලබා ගැනීමට ක්‍රමයක් තිබේද? නැතහොත් වස්තුව .encode භාවිතා කිරීමට නූල්ද, නැතිනම් str () භාවිතා කරන්නේද යන්න පරීක්ෂා කිරීම සඳහා අපි දැන් IF චෙක්පතක් එක් කළ යුතුද?
ඩර්ක් ආර්

එකම ප්‍රශ්නය Noneවටිනාකමින් විමසිය හැකිය .
Vadorequest

214

සංකේත ඉවත් කිරීමට සහ පහත දැක්වෙන පරිදි නූල් ලෙස දිගටම තබා ගැනීමට මට අලංකාර වැඩක් හමු විය:

yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')

නොසලකා හැරීමේ විකල්පය භාවිතා කිරීම භයානක බව සැලකිල්ලට ගැනීම වැදගත්ය, මන්දයත් එය භාවිතා කරන කේතයෙන් ඕනෑම යුනිකෝඩ් (සහ ජාත්‍යන්තරකරණ) ආධාරයක් නිහ ly ව පහත හෙලන බැවිනි (මෙහි යුනිකෝඩ් පරිවර්තනය කරන්න):

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'

17
ඔයා මගේ දවස හැදුවා! Utf-8 සඳහා, එය කිරීමට ප්‍රමාණවත්:yourstring = yourstring.encode('utf-8', 'ignore').decode('utf-8')
luca76

මට මෙය ක්‍රියාත්මක වූ නමුත් මගේ නඩුව වෙනස් විය, මම ලිපිගොනු නම් සුරකින අතර නමෙහි "/" තිබීම සහ මාර්ගය නොපවතින බැවින් මට .replace ("/", "") භාවිතා කළ යුතු අතර එමඟින් සුරකින ලදි මගේ පිටපත. ascii නොසලකා හැරීම 'utf-8' නඩුව සඳහාද ක්‍රියා කරයි.
ආකාෂ් කන්ඩ්පාල්

1
හරස් මාර්ග නිවැරදිව භාවිතා කිරීම සඳහා harrypotter0 os.path.join(), ඔබ හරස් වේදිකා වැඩසටහන්කරණය ආරම්භ කරන විට එය ඉතා හොඳ පුරුද්දකි. :)
login_not_failed

155

හොඳයි, මම සෑම දෙයක්ම අත්හදා බැලුවද එය උදව් කළේ නැත. python 2.7 භාවිතයේ පවතී.

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

7
මෙය නොකරන්න. stackoverflow.com/questions/3828723/… , ඔබට මෙම stackoverflow.com/a/31137935/2141635 වැනි පිළිතුරු ඇති විට ඔබ දෝෂය සෙවූ විට එය හොඳ අදහසක් ලෙස පෙනෙන්නේ මන්දැයි මට පෙනේ.
පැඩ්රික් කනිංහැම්

22
මෙම මාතෘකාවේ ඇති යෝජනා සියල්ලම පාහේ මම අත්හදා බැලුවෙමි. අන්තිමට මම මේක අත්හදා බැලුවා. ඇත්තෙන්ම එය සරල හා හොඳ වැඩ කළ එකම දෙයයි. කවුරුහරි "මෙය නොකරන්න, සරල විසඳුමක් සමඟ එන්න. එසේ නොමැතිනම් මෙය භාවිතා කරන්න. මන්ද එය හොඳ ක්‍රියාකාරී පිටපතක් සහ අතීත විසඳුමක් වන බැවිනි.
රිචඩ් ද රී

4
පයිතන් 3 හි මෙය කළ හැක්කේ කෙසේද? දැන ගැනීමට සතුටු වනු ඇත.
කනර්වා පීටර්

3
බොහෝ කලකිරීමෙන් පසු මේ තැනැත්තා වැඩ කළේය. ගොඩක් ස්තුතියි.
අව්රාහම් ෂුර්බා

5
මම දැන් එකතු කරන්නම්if sys.version_info.major < 3:
මහාචාර්ය ෆැල්කන්

91

මුද්‍රණය පවා අසාර්ථක වීමට හේතු වන සියුම් ගැටළුවක් නම් ඔබේ පරිසර විචල්‍යයන් වැරදි ලෙස සකසා තිබීමයි, උදා. මෙහි LC_ALL "C" ලෙස සකසා ඇත. ඩේබියන් භාෂාවෙන් ඔවුන් එය සැකසීම අධෛර්යමත් කරයි: පෙදෙසෙහි ඩෙබියන් විකිය

$ echo $LANG
en_US.utf8
$ echo $LC_ALL 
C
$ python -c "print (u'voil\u00e0')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
$ export LC_ALL='en_US.utf8'
$ python -c "print (u'voil\u00e0')"
voilà
$ unset LC_ALL
$ python -c "print (u'voil\u00e0')"
voilà

හරියටම එකම ප්‍රශ්නයක් ඇත, ඉතා නරක බැවින් වාර්තා කිරීමට පෙර මම එය පරීක්ෂා නොකළෙමි . ගොඩක් ස්තුතියි. මාර්ගය වන විට, ඔබට පළමු විධාන දෙක ආදේශ කළ හැකිය env|grep -E '(LC|LANG)'.
දිමිත්‍රි වර්හෝටුරෝව්

වැරදි කේතීකරණ ගැටලුව සම්බන්ධයෙන් මගේ ශත දෙක පමණි. මම නිතරම mc"සබ්ෂෙල් මාදිලියේ" ( Ctrl-O) භාවිතා කරන අතර පහත දැක්වෙන අන්වර්ථය බාෂ් සඳහා එකතු කළ බව මට අමතක විය : alias mc="LANG=en_EN.UTF-8 mc". ඒ නිසා මම ru_RU.UTF-8අභ්‍යන්තරව රඳා පවතින දුර්වල ලෙස ලියා ඇති පිටපත් ධාවනය කිරීමට උත්සාහ කළ විට ඒවා මිය යයි. මම ඇත්ත ප්‍රශ්නය සොයා ගැනීමට පෙර මෙම ත්‍රෙඩ් එකෙන් බොහෝ දේ අත්හදා බැලුවෙමි. :)
login_not_failed

ඔබ විශිෂ්ටයි. GSUTIL හි, මගේ rsync අසමත් වූයේ හරියටම මෙම ගැටලුව නිසාය. LC_ALL ස්ථාවර කර ඇති අතර සෑම දෙයක්ම වයින් ලෙස හොඳින් ක්‍රියාත්මක වේ. <3 ඔබට
ස්තූතියි

27

මට නම් වැඩ කළේ:

BeautifulSoup(html_text,from_encoding="utf-8")

මෙය යමෙකුට උපකාරී වේ යැයි සිතමි.


26

මගේ බොහෝ අවස්ථාවන්හිදී, එම අක්ෂර ඉවත් කිරීම වඩා සරල බව මම ඇත්ත වශයෙන්ම සොයාගෙන ඇත්තෙමි:

s = mystring.decode('ascii', 'ignore')

26
“පරිපූර්ණව” යනු සාමාන්‍යයෙන් එය ඉටු කරන දෙය නොවේ. එය නිසි ලෙස ගනුදෙනු කරන්නේ කෙසේදැයි ඔබ විසින් හඳුනාගත යුතු දේවල් ඉවත දමයි.
ත්‍රිත්ව

7
"එම" (ඉංග්‍රීසි නොවන) අක්ෂර ඉවත් කිරීම විසඳුම නොවේ, මන්ද පයිතන් සියලු භාෂාවන්ට සහාය විය යුතු යැයි ඔබ සිතන්නේ නැද්ද?
alemol

8
පහත් කොට ඇත. මෙය කිසිසේත්ම නිවැරදි විසඳුම නොවේ. යුනිකෝඩ් සමඟ වැඩ කරන්නේ කෙසේදැයි ඉගෙන ගන්න: joelonsoftware.com/articles/Unicode.html
ෆෙරියර්

4
බලන්න, මෙම විශේෂිත පිළිතුර ඉදිරිපත් කිරීම සඳහා වඩාත්ම යුක්තිසහගත ක්‍රමය මේ ආකාරයෙන් ය: ඇතැම් භාෂා සහ පරිශීලකයින්ට යම් වරප්‍රසාදයක් ලබා දෙන බව පිළිගැනීම - මෙය කර්සරයක් අනවසරයෙන් සොරකම් කරන පරිශීලකයින් සඳහා ප්‍රයෝජනයට ගත හැකි ගැලවීමේ හැච් ය. , සම්පූර්ණ යුනිකෝඩ් සහාය ක්‍රියාත්මක කිරීමට පෙර මූලික වැඩ සඳහා ස්ක්‍රිප්ට් එකට එකතු විය හැකිය.
lol

5
මම අභ්‍යන්තර සමාගම් යෙදුමක ඉගෙනීම සඳහා ඉංග්‍රීසි පෙළ මුද්‍රණය කළ යුතු පිටපතක් ලියන්නේ නම්, මට අවශ්‍ය වන්නේ ගැටලුව මඟහරවා ගැනීමයි. මොනවා වුනත්.
කග්‍රොනික්

26

ගැටළුව වන්නේ ඔබ යුනිකෝඩ් අක්ෂරයක් මුද්‍රණය කිරීමට උත්සාහ කිරීමයි, නමුත් ඔබේ පර්යන්තය එයට සහාය නොදක්වයි.

එය නිවැරදි කිරීම සඳහා ඔබට language-pack-enපැකේජය ස්ථාපනය කිරීමට උත්සාහ කළ හැකිය :

sudo apt-get install language-pack-en

එය සහාය දක්වන සියලුම පැකේජ සඳහා (පයිතන් ඇතුළුව) ඉංග්‍රීසි පරිවර්තන දත්ත යාවත්කාලීන කිරීම් සපයයි. අවශ්‍ය නම් විවිධ භාෂා පැකේජයක් ස්ථාපනය කරන්න (ඔබ මුද්‍රණය කිරීමට උත්සාහ කරන අක්ෂර අනුව).

සමහර ලිනක්ස් බෙදාහැරීම් වලදී පෙරනිමි ඉංග්‍රීසි ස්ථාන නිසි ලෙස සකසා ඇති බව තහවුරු කර ගැනීම සඳහා අවශ්‍ය වේ (එබැවින් යුනිකෝඩ් අක්ෂර ෂෙල් / ටර්මිනල් මගින් හැසිරවිය හැක). සමහර විට එය අතින් වින්‍යාස කිරීමට වඩා එය ස්ථාපනය කිරීම පහසුය.

කේතය ලිවීමේදී, ඔබේ කේතයේ නිවැරදි කේතන ක්‍රමයක් භාවිතා කිරීමට වග බලා ගන්න.

උදාහරණයක් වශයෙන්:

open(foo, encoding='utf-8')

ඔබට තවමත් ගැටලුවක් තිබේ නම්, ඔබේ පද්ධති වින්‍යාසය දෙවරක් පරීක්ෂා කරන්න,

  • ඔබගේ ස්ථාන ගොනුව ( /etc/default/locale), උදා

    LANG="en_US.UTF-8"
    LC_ALL="en_US.UTF-8"

    හෝ:

    LC_ALL=C.UTF-8
    LANG=C.UTF-8
  • කවචයේ LANG/ අගය LC_CTYPE.

  • ඔබගේ කවචය සහාය දෙන්නේ කුමන ස්ථානයෙන්දැයි පරීක්ෂා කරන්න:

    locale -a | grep "UTF-8"

නැවුම් වීඑම් තුළ ගැටළුව සහ විසඳුම නිරූපණය කිරීම.

  1. වීඑම් ආරම්භ කිරීම සහ සැපයීම (උදා: භාවිතා කිරීම vagrant):

    vagrant init ubuntu/trusty64; vagrant up; vagrant ssh

    බලන්න: ලබා ගත හැකි උබුන්ටු පෙට්ටි . .

  2. යුනිකෝඩ් අක්ෂර මුද්‍රණය කිරීම (වෙළඳ ලකුණු ලකුණ වැනි ):

    $ python -c 'print(u"\u2122");'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 0: ordinal not in range(128)
  3. දැන් ස්ථාපනය කරන්නේ language-pack-en:

    $ sudo apt-get -y install language-pack-en
    The following extra packages will be installed:
      language-pack-en-base
    Generating locales...
      en_GB.UTF-8... /usr/sbin/locale-gen: done
    Generation complete.
  4. දැන් ගැටලුව විසඳිය යුතුය:

    $ python -c 'print(u"\u2122");'
    
  5. එසේ නොමැතිනම්, පහත දැක්වෙන විධානය උත්සාහ කරන්න:

    $ LC_ALL=C.UTF-8 python -c 'print(u"\u2122");'
    

1
දේ කර ඇත language-pack-enpython, මෙම ප්රශ්නය සමග කරන්න තියෙනවද? AFAIK, එය පණිවිඩ වලට භාෂා පරිවර්තන ලබා දිය හැකි නමුත් කේතන
ක්‍රමයට

2
සමහර ලිනක්ස් බෙදාහැරීම් වලදී, පෙරනිමි ඉංග්‍රීසි ස්ථාන නිසි ලෙස සකසා ඇති බව තහවුරු කර ගැනීම සඳහා අවශ්‍ය වේ, විශේෂයෙන් ටර්මිනලයේ පයිතන් ස්ක්‍රිප්ට් ධාවනය කිරීමේදී. එය එක් අවස්ථාවක මට වැඩ කළා. බලන්න: අක්ෂර කේතනය
kenorb

ආ ... හරි. ඔබ අදහස් කළේ ඔබට ඉංග්‍රීසි නොවන ස්ථානයක් භාවිතා කිරීමට අවශ්‍ය නම්? මම හිතන්නේ පරිශීලකයාට /etc/locale.genඑය භාවිතා කිරීමට පෙර ඔවුන්ගේ ස්ථානය ඉදිකර ඇති බව සහතික කිරීම සඳහා සංස්කරණය කිරීමට සිදුවනු ඇත ?
ඇලෙස්ටෙයාර් මැකෝර්මාක්

1
LaAlastairMcCormack LANGවෙතින් අදහස් දක්වමින් /etc/default/locale( /etc/locale.genනොපවතින පරිදි) දුව ගොස් ඇත locale-gen, නමුත් එය උදව් කළේ නැත. language-pack-enහරියටම ලියකියවිලි සොයා නොගත් නිසා සහ එහි අන්තර්ගතය ලැයිස්තුගත කිරීම බොහෝ සෙයින් උපකාරී නොවන බැවින් හරියටම කුමක් කරන්නේ දැයි මට විශ්වාස නැත .
kenorb

1
දැනටමත් ඩෙස්ක්ටොප් පද්ධතියක utf-8 ස්ථාන නොමැති බව සිතිය නොහැක, එනම්, ඔබට කිසිවක් ස්ථාපනය කිරීමට අවශ්‍ය නොවනු ඇත, වින්‍යාස කරන්න LANG/ LC_CTYPE/ LC_ALLවෙනුවට (උදා. LANG=C.UTF-8).
jfs

20

කවචයෙන්:

  1. පහත දැක්වෙන විධානය මඟින් සහාය දක්වන UTF-8 පෙදෙස සොයා ගන්න:

    locale -a | grep "UTF-8"
  2. ස්ක්‍රිප්ට් ධාවනය කිරීමට පෙර එය අපනයනය කරන්න, උදා:

    export LC_ALL=$(locale -a | grep UTF-8)

    හෝ අතින් කැමති:

    export LC_ALL=C.UTF-8
  3. විශේෂ අක්ෂර මුද්‍රණය කිරීමෙන් එය පරීක්ෂා කරන්න, උදා :

    python -c 'print(u"\u2122");'

ඉහත උබුන්ටු හි පරීක්ෂා කර ඇත.


ඔව් මෙය හොඳම කෙටි පිළිතුරයි, අපට භාවිතා කිරීමට ප්‍රභව කේතය වෙනස් කළ නොහැක .encode
Luat Nguyen - Neo.Mxn0

LC_ALL සැකසීමෙන් පසු මම දැන් එය python3 සහ එහි ක්‍රියාකාරී දඩය භාවිතා කළෙමි. ස්තූතියි
අජේ

16

ඔබගේ ස්ක්‍රිප්ටයේ ආරම්භයේ (හෝ දෙවන පේළිය ලෙස) පහත පේළිය එක් කරන්න:

# -*- coding: utf-8 -*-

එය පයිතන් ප්‍රභව කේත කේතීකරණයේ අර්ථ දැක්වීමයි. PEP 263 හි වැඩි විස්තර .


2
බාහිර ගොනුවෙන් පටවන ලද සැකසූ පෙළෙහි utf-8 කේතීකරණ අඩංගු වන විට මෙය ගැටළුව විසඳන්නේ නැත. මෙය ලබා දී ඇත්තේ පයිතන් පිටපතෙහි ලියා ඇති සාහිත්‍යකරුවන්ට පමණක් වන අතර එය පයිතන් පරිවර්තකයා සඳහා ඉඟියක් පමණක් වන නමුත් පෙළ සැකසීමට කිසිදු බලපෑමක් නොකරයි.
මයිකල්බ්ලොම්ක්විස්ට්සන්

15

මෙන්න තවත් ඊනියා "කොප් අවුට්" පිළිතුරු නැවත සකස් කිරීමකි. මෙහි විරෝධතා නොතකා කරදරකාරී චරිත / නූල් ඉවතට විසි කිරීම හොඳ විසඳුමක් වන අවස්ථා තිබේ.

def safeStr(obj):
    try: return str(obj)
    except UnicodeEncodeError:
        return obj.encode('ascii', 'ignore').decode('ascii')
    except: return ""

එය පරීක්ෂා කිරීම:

if __name__ == '__main__': 
    print safeStr( 1 ) 
    print safeStr( "test" ) 
    print u'98\xb0'
    print safeStr( u'98\xb0' )

ප්රතිපල:

1
test
98°
98

යෝජනාව: toAsciiඒ වෙනුවට ඔබට මෙම ශ්‍රිතය නම් කිරීමට අවශ්‍ය විය හැකිද? එය මනාප කාරණයක්.

මෙය ලියා ඇත්තේ පයිතන් 2 සඳහා ය. පයිතන් 3 සඳහා, ඔබට bytes(obj,"ascii")වඩා භාවිතා කිරීමට අවශ්‍ය වනු ඇතැයි මම විශ්වාස කරමි str(obj). මම මෙය තවම පරීක්‍ෂා කර නැත, නමුත් මම යම් අවස්ථාවක දී පිළිතුර සංශෝධනය කරමි.


8

මම සෑම විටම කේතය පයිතන් ලිපිගොනු වල පළමු පේළි දෙකෙහි තබමි:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

6

සරල උපකාරක කාර්යයන් මෙහි හමු වේ.

def safe_unicode(obj, *args):
    """ return the unicode representation of obj """
    try:
        return unicode(obj, *args)
    except UnicodeDecodeError:
        # obj is byte string
        ascii_text = str(obj).encode('string_escape')
        return unicode(ascii_text)

def safe_str(obj):
    """ return the byte string representation of obj """
    try:
        return str(obj)
    except UnicodeEncodeError:
        # obj is unicode
        return unicode(obj).encode('unicode_escape')

ගැලවී ගිය බයිටෙස්ට්‍රිං ලබා ගැනීම සඳහා (අත්තනෝමතික යුනිකෝඩ් නූල ascii කේතීකරණ භාවිතා කරමින් බයිට් බවට පරිවර්තනය කිරීම සඳහා), ඔබට backslashreplaceදෝෂ හසුරුවන්නා භාවිතා කළ හැකිය : u'\xa0'.encode('ascii', 'backslashreplace'). ඔබ එවැනි නිරූපණයෙන් වැළකී ඒ වෙනුවට ඇස්කි නොවන අක්ෂර පිළිගැනීමට ඔබේ පරිසරය වින්‍යාසගත කළ යුතු වුවද - එය 2016 වේ!
jfs

සුභ නව වසරක් @JFSebastian. මම දැන් පයිතන්-යුනිකෝඩ් ගැටලුව ගැන කලකිරීමට පත් වූ අතර අවසානයේදී මෙම විසඳුම ක්‍රියාත්මක විය. මම මේ ගැන දැනගෙන හිටියේ නැහැ. කෙසේ හෝ ඉඟියට ස්තූතියි.
පැරග් තියාගි


4

මම පහත සඳහන් දෑ භාවිතා කළෙමි:

import unicodedata
message = unicodedata.normalize("NFKD", message)

ඒ පිළිබඳව ලියකියවිලි පවසන්නේ කුමක්දැයි පරීක්ෂා කරන්න:

unicodedata.normalize (form, unistr) යුනිකෝඩ් නූල් unistr සඳහා සාමාන්‍ය පෝරමය නැවත ලබා දෙන්න. පෝරමය සඳහා වලංගු අගයන් වන්නේ 'NFC', 'NFKC', 'NFD' සහ 'NFKD' ය.

කැනොනිකල් සමානාත්මතාවය සහ අනුකූලතා සමානාත්මතාවය අර්ථ දැක්වීම මත පදනම්ව යුනිකෝඩ් ප්‍රමිතිය යුනිකෝඩ් නූලක විවිධ සාමාන්‍යකරණ ආකාර නිර්වචනය කරයි. යුනිකෝඩ් හි, අක්ෂර කිහිපයක් විවිධාකාරයෙන් ප්‍රකාශ කළ හැකිය. උදාහරණයක් ලෙස, U + 00C7 (LATIN CAPITAL LETTER C WITH CEDILLA) අක්ෂරය U + 0043 (LATIN CAPITAL LETTER C) U + 0327 (COMBINING CEDILLA) අනුක්‍රමය ලෙස ප්‍රකාශ කළ හැකිය.

සෑම අක්‍ෂරයක් සඳහාම සාමාන්‍ය ආකාර දෙකක් ඇත: සාමාන්‍ය ස්වරූපය C සහ සාමාන්‍ය ස්වරූපය D. සාමාන්‍ය ස්වරූපය D (NFD) කැනොනිකල් වියෝජනය ලෙසද හැඳින්වෙන අතර එක් එක් අක්ෂර එහි දිරාපත් වූ ස්වරූපයට පරිවර්තනය කරයි. සාමාන්‍ය ස්වරූපය C (NFC) පළමුව කැනොනිකල් වියෝජනයකට යොදන අතර නැවත පෙර-ඒකාබද්ධ අක්ෂර රචනා කරයි.

මෙම ආකෘති දෙකට අමතරව, අනුකූලතා සමානාත්මතාවය මත පදනම් වූ අතිරේක සාමාන්‍ය ආකාර දෙකක් තිබේ. යුනිකෝඩ් හි, ඇතැම් අක්ෂර සඳහා සහය දක්වන අතර ඒවා සාමාන්‍යයෙන් වෙනත් අක්ෂර සමඟ ඒකාබද්ධ වේ. උදාහරණයක් ලෙස, U + 2160 (ROMAN NUMERAL ONE) ඇත්ත වශයෙන්ම U + 0049 (LATIN CAPITAL LETTER I) හා සමාන වේ. කෙසේ වෙතත්, පවතින අක්‍ෂර කට්ටල (උදා: gb2312) සමඟ අනුකූල වීම සඳහා එය යුනිකෝඩ් හි සහය දක්වයි.

KD (NFKD) යන සාමාන්‍ය ස්වරූපය අනුකූලතා විසංයෝජනයට අදාළ වේ, එනම් සියලු අනුකූලතා අක්ෂර ඒවායේ සමානකම් සමඟ ප්‍රතිස්ථාපනය කරයි. KC (NFKC) හි සාමාන්‍ය ස්වරූපය පළමුව අනුකූලතා වියෝජනය අදාළ වන අතර ඉන්පසු කැනොනිකල් සංයුතිය අනුගමනය කරයි.

යුනිකෝඩ් නූල් දෙකක් සාමාන්‍යකරණය කර මිනිස් පා er කයෙකුට එක හා සමාන ලෙස පෙනුනත්, එක් අක්ෂර සංයුක්ත වී ඇති අතර අනෙක එසේ නොවේ නම්, ඒවා සමාන ලෙස සැසඳිය නොහැක.

එය මා වෙනුවෙන් විසඳයි. සරල හා පහසුය.


4

කරුණාකර ටර්මිනලය විවෘත කර පහත විධානයට වෙඩි තබන්න:

export LC_ALL="en_US.UTF-8"

3

පහත විසඳුම මා වෙනුවෙන් වැඩ කර ඇත

u "නූල්"

(නූල යුනිකෝඩ් ලෙස නිරූපණය කරයි) මගේ නූලට පෙර.

result_html = result.to_html(col_space=1, index=False, justify={'right'})

text = u"""
<html>
<body>
<p>
Hello all, <br>
<br>
Here's weekly summary report.  Let me know if you have any questions. <br>
<br>
Data Summary <br>
<br>
<br>
{0}
</p>
<p>Thanks,</p>
<p>Data Team</p>
</body></html>
""".format(result_html)

3

අහෝ මෙය අවම වශයෙන් පයිතන් 3 හි ක්‍රියා කරයි ...

පයිතන් 3

සමහර විට දෝෂය පරිසර විචල්‍යයන්හි පවතින අතර එසේ වේ

import os
import locale
os.environ["PYTHONIOENCODING"] = "utf-8"
myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8")
... 
print(myText.encode('utf-8', errors='ignore'))

කේතීකරණයේදී දෝෂ නොසලකා හරිනු ලැබේ.


2

මට මේ ගැටලුව ඇති අතර ගූගල් මාව මෙහි ගෙන ගියේය, එබැවින් මෙහි ඇති පොදු විසඳුම් එකතු කිරීම සඳහා, මෙය මට වැඩ කළේ:

# 'value' contains the problematic data
unic = u''
unic += value
value = unic

නෙඩ්ගේ ඉදිරිපත් කිරීම කියවීමෙන් පසුව මට මෙම අදහස ඇති විය .

මෙය ක්‍රියාත්මක වන්නේ ඇයිද යන්න සම්පූර්ණයෙන් තේරුම් ගැනීමට මම නොකියමි. එබැවින් ඕනෑම කෙනෙකුට මෙම පිළිතුර සංස්කරණය කිරීමට හෝ පැහැදිලි කිරීම සඳහා අදහස් දැක්වීමක් කළ හැකි නම්, මම එය අගය කරමි.


3
මොකක්ද මේ typeවටිනාකමින්? මෙයට පෙර සහ පසු? මම හිතන්නේ එය ක්‍රියාත්මක වන්නේ ඔබ නූල් සහ යුනිකෝඩ් එකක් එකතු කරන unic += valueආකාරයටම unic = unic + valueකිරීමෙන් පයිතන් පසුව ප්‍රති ic ලය සඳහා යුනිකෝඩ් උපකල්පනය කරයි, unicඑනම් වඩාත් නිවැරදි වර්ගය (ඔබ මෙය කරන විට සිතා බලන්න a = float(1) + int(1), aපාවෙන බවට පත්වේ) සහ පසුව value = unicදෙයි valueනව කිරීමට unicයුනිකෝඩ් විය සිදුවන, වස්තුව.
ටොම් මයිඩෙල්ටින්

2

manage.py migrateදේශීයකරණය කරන ලද සවිකිරීම් සමඟ ජැන්ගෝ හි ධාවනය වන විට අපි මෙම දෝෂය ඇතිවිය .

අපගේ ප්‍රභවයේ # -*- coding: utf-8 -*-ප්‍රකාශය අඩංගු වූ අතර , MySQL නිවැරදිව utf8 සඳහා වින්‍යාස කර ඇති අතර උබුන්ටු සතුව සුදුසු භාෂා ඇසුරුමක් සහ අගයන් ඇත /etc/default/locale.

ගැටළුව වූයේ ජැන්ගෝ කන්ටේනරය (අපි ඩොකර් භාවිතා කරමු) නැති වීමයි LANG env var වීමයි.

කිරීම LANGසඳහා en_US.UTF-8සහ ගැටලුව විසදා නැවත ධාවනය සංක්රමණය පෙර කන්ටේනර් නැවත පණ ගැන්වීමකින්.


1

මෙහි බොහෝ පිළිතුරු (නිදසුනක් ලෙස @agf සහ ndAndbdrew) දැනටමත් OP ප්‍රශ්නයේ ආසන්නතම කරුණු ආමන්ත්‍රණය කර ඇත.

කෙසේ වෙතත්, බොහෝ දුරට නොසලකා හරින ලද සියුම් නමුත් වැදගත් අංගයක් ඇති බව මම සිතමි. පයිතන් හි කේතන ක්‍රම පිළිබඳ හැඟීමක් ඇති කර ගැනීමට උත්සාහ කරන අතරතුර මා වැනි සෑම කෙනෙකුම මෙහි දී අවසන් විය: පයිතන් 2 එදිරිව පයිතන් 3 චරිත නිරූපණය කළමනාකරණය අතිශයින් වෙනස් ය . අනුවාදය නොදැන පයිතන් හි කේතන ක්‍රම ගැන කියවන පුද්ගලයින් සමඟ විශාල ව්‍යාකූලත්වයක් ඇති බව මට හැඟේ.

OP ගැටලුවේ මූල හේතුව තේරුම් ගැනීමට උනන්දුවක් දක්වන ඕනෑම කෙනෙකුට මම යෝජනා කරන්නේ අක්ෂර නිරූපණයන් සහ යුනිකෝඩ් පිළිබඳ ස්පොල්ස්කිගේ හැඳින්වීම කියවීමෙන් පසුව පයිතන් 2 සහ පයිතන් 3 හි යුනිකෝඩ් හි බැට්චෙල්ඩර් වෙත යන්න .


ඔව්, මගේ දෝෂය පයිතන් 2.7, 'a'.format (u'ñ') මත වූ අතර නිවැරදි විසඳුම වන්නේ .encode ('utf-8') භාවිතා කිරීම නොව සෑම විටම යුනිකෝඩ් නූල් භාවිතා කිරීමයි. (පයිතන් 3 හි පෙරනිමිය ): u'a'.format (u'ñ '),
Rogelio Triviño

1

විචල්යය str (විචල්ය) බවට පරිවර්තනය කිරීමෙන් වළකින්න. සමහර විට, එය ගැටළුව ඇති කළ හැකිය.

වළක්වා ගැනීමට සරල ඉඟිය:

try: 
    data=str(data)
except:
    data = data #Don't convert to String

ඉහත උදාහරණයෙන් එන්කෝඩ් දෝෂය ද විසඳනු ඇත.


ඔබ හැරෙන්නට වැරැද්දට හසු වන බැවින් මෙය ක්‍රියා නොකරයි
ඕරෙල් කොලිනට්

1

සාමාන්‍යයෙන් මෙම සහය නොදක්වන කේතීකරණ නූල ( data_that_causes_this_errorසමහර විට) සමහර ගොනුවකට ලිවීමට (උදා:) results.txt, මෙය ක්‍රියාත්මක වේ

f = open("results.txt", "w")
  f.write(data_that_causes_this_error.encode('utf-8'))
  f.close()

0

ඔබට එවැනි දෙයක් තිබේ packet_data = "This is data"නම් මෙය ආරම්භ කළ වහාම ඊළඟ පේළියේ කරන්න packet_data:

unic = u''
packet_data = unic

0

පයිතන් 3.0 සහ පසුව යාවත්කාලීන කරන්න. පයිතන් සංස්කාරකයේ පහත සඳහන් දෑ උත්සාහ කරන්න:

locale-gen en_US.UTF-8
export LANG=en_US.UTF-8 LANGUAGE=en_US.en
LC_ALL=en_US.UTF-8

මෙය පද්ධතියේ පෙරනිමි ස්ථාන කේතන ක්‍රමය UTF-8 ආකෘතියට සකසයි.

තවත් බොහෝ දේ PEP 538 හි කියවිය හැකිය - උරුමය C පෙදෙස UTF-8 පදනම් කරගත් පෙදෙසකට බල කිරීම .


0

මට මෙම ගැටළුව යුනිකෝඩ් අක්ෂර ප්‍රතිදානය කිරීමට උත්සාහ කළ stdoutනමුත් sys.stdout.writeමුද්‍රණය වෙනුවට (වෙනත් ගොනුවකට ප්‍රතිදානය සඳහා සහාය වීමට හැකිවන පරිදි).

BeautifulSoup හි ලියකියවිලි වලින් මම මෙය කෝඩෙක්ස් පුස්තකාලය සමඟ විසඳා ගත්තෙමි:

import sys
import codecs

def main(fIn, fOut):
    soup = BeautifulSoup(fIn)
    # Do processing, with data including non-ASCII characters
    fOut.write(unicode(soup))

if __name__ == '__main__':
    with (sys.stdin) as fIn: # Don't think we need codecs.getreader here
        with codecs.getwriter('utf-8')(sys.stdout) as fOut:
            main(fIn, fOut)

0

මෙම ගැටළුව බොහෝ විට සිදුවන්නේ ජැංගෝ ව්‍යාපෘතියක් අපාචේ භාවිතා කරන විටය. අපාචේ විසින් පරිසර විචල්‍යය LANG = C / etc / sysconfig / httpd ලෙස සකසයි. ගොනුව විවෘත කර මෙම සැකසුම ගැන අදහස් දක්වන්න (හෝ ඔබේ රසයට වෙනස් කරන්න). නැතහොත් WSGIDaemonProcess විධානයෙහි lang විකල්පය භාවිතා කරන්න, මේ අවස්ථාවේ දී ඔබට විවිධ LANG පරිසර විචල්‍යය විවිධ අථත්‍ය අථත්‍යයන්ට සැකසීමට හැකි වේ.


0

නිර්දේශිත විසඳුම මා වෙනුවෙන් ක්‍රියාත්මක නොවූ අතර, සියලු ඇස්කි නොවන චරිත ඉවතලමින් මට ජීවත් විය හැකිය

s = s.encode('ascii',errors='ignore')

එමඟින් දෝෂ ඉවත් නොවන යමක් ඉවත් කර ඇත.


0

මෙය ක්‍රියාත්මක වනු ඇත:

 >>>print(unicodedata.normalize('NFD', re.sub("[\(\[].*?[\)\]]", "", "bats\xc3\xa0")).encode('ascii', 'ignore'))

ප්‍රතිදානය:

>>>bats
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.