كيف يمكنني استخدام أحرف ممتدة في مكتبة لعنات بيثون؟

StackOverflow https://stackoverflow.com/questions/1279341

  •  16-09-2019
  •  | 
  •  

سؤال

لقد كنت أقرأ البرامج التعليمية حول اللعنات البرمجة في Python، والشديد الكثير من الرجوع إلى القدرة على استخدام الأحرف الموسعة، مثل رموز رسم خط. إنها شخصيات> 255، و تعرف مكتبة اللعنات عن كيفية عرضها في الخط الطرفي الحالي.

يقول بعض البرامج التعليمية أنك تستخدمها مثل هذا:

c = ACS_ULCORNER

... ويقول البعض أنك تستخدمه مثل هذا:

c = curses.ACS_ULCORNER

(من المفترض أن تكون الزاوية العلوية اليسرى من مربع، مثل an l difi

على أي حال، بغض النظر عن الطريقة التي أستخدمها، لا يتم تعريف الاسم ويفشل البرنامج بهذا البرنامج. حاولت "استيراد لعنات" و "من الاستيراد من الاستيراد *"، ولا يعمل.

تنفذ وظيفة النافذة المعرنة () استخدام هذه الأحرف، لذلك حاولت حتى التمثال في صندوقي للمصدر لمعرفة كيف هو - هي يفعل ذلك، لكن لا يمكنني العثور عليه في أي مكان.

هل كانت مفيدة؟

المحلول

من عند curses/__init__.py:

بعض الثوابت، والأبرز ACS_*تلك، تضاف فقط إلى ج _curses قاموس الوحدة بعد initscr() يسمى. (لا تحدد بعض إصدارات لعنات SGI القيم لتلك الثوابت حتى initscr()وقد تم استدعاء.) هذه وظيفة المجمع تستدعي C الأساسي initscr(), ثم نسخ الثوابت من _curses وحدة إلى قاموس حزمة اللعنات. لا تفعلfrom curses import *إذا كنت ستحتاج إلى ACS_* الثوابت.

بعبارات أخرى:

>>> import curses
>>> curses.ACS_ULCORNER
exception
>>> curses.initscr()
>>> curses.ACS_ULCORNER
>>> 4194412

نصائح أخرى

أعتقد أن ما يلي مرتبطا بشكل مناسب، ليتم نشره بموجب هذا السؤال. هنا سأكون تستخدم utfinfo.pl. (انظر أيضا على سوبر المستخدم).

بادئ ذي بدء، لمجموعة حرف ASCII القياسية، نقطة رمز Unicode وتشفير البايت هو نفسه:

$ echo 'a' | perl utfinfo.pl 
Char: 'a' u: 97 [0x0061] b: 97 [0x61] n: LATIN SMALL LETTER A [Basic Latin]

حتى نتمكن من القيام به في بيثون curses:

window.addch('a')
window.border('a') 

... ويعمل على النحو المقصود

ومع ذلك، إذا كانت الشخصية أعلى من ASCII الأساسية، فهناك اختلافات، والتي addch مستندات لا تجعل بالضرورة صريحة. أولا، يمكنني القيام به:

window.addch(curses.ACS_PI)
window.border(curses.ACS_PI)

... في هذه الحالة، في بلدي gnome-terminal, ، حرف Unicode 'π' مصنوع. ومع ذلك، إذا كنت تفحص ACS_PI, ، سترى أنه عدد صحيح، بقيمة 4194427 (0x40007b)؛ لذا فإن ما يلي سيقدم نفس الحرف (أو Rater، Glyph؟) "π":

window.addch(0x40007b)
window.border(0x40007b)

لمعرفة ما يجري، أنا محرز ncurses المصدر، ووجد ما يلي:

#define ACS_PI      NCURSES_ACS('{') /* Pi */  
#define NCURSES_ACS(c)  (acs_map[NCURSES_CAST(unsigned char,c)])
#define NCURSES_CAST(type,value) static_cast<type>(value)
#lib_acs.c: NCURSES_EXPORT_VAR(chtype *) _nc_acs_map(void): MyBuffer = typeCalloc(chtype, ACS_LEN);
#define typeCalloc(type,elts) (type *)calloc((elts),sizeof(type))
#./widechar/lib_wacs.c: { '{',  { '*',  0x03c0 }},  /* greek pi */

ملاحظة هنا:

$ echo '{π' | perl utfinfo.pl 
Got 2 uchars
Char: '{' u: 123 [0x007B] b: 123 [0x7B] n: LEFT CURLY BRACKET [Basic Latin]
Char: 'π' u: 960 [0x03C0] b: 207,128 [0xCF,0x80] n: GREEK SMALL LETTER PI [Greek and Coptic]

... لا أي منها يتعلق بقيمة 4194427 (0x40007B) ل ACS_PI.

وهكذا، متى addch و / أو border انظر شخصية فوق ASCII (أساسا unsigned int, ، في مقابل unsigned char)، هم (على الأقل في هذه الحالة) استخدام هذا الرقم ليس كوسعة رمز Unicode، أو كتمثيل UTF-8 المشفر بايتات - ولكن بدلا من ذلك، يستخدمونها كمؤشر للنظر acs_mapوظيفة (التي في نهاية المطاف، ومع ذلك، سيكون إرجاع نقطة رمز Unicode، حتى لو كان يحاكي VT-100). هذا هو السبب في المواصفات التالية:

window.addch('π') 
window.border('π') 

سوف تفشل في بيثون 2.7 مع argument 1 or 3 must be a ch or an int; ؛ وفي بيثون 3.2 من شأنه أن يجعل مساحة ببساطة بدلا من حرف. عندما نحدد 'π'. وبعد لقد حددنا بالفعل ترميز UTF-8 [0xcf، 0x80] - ولكن حتى لو حددنا نقطة رمز Unicode:

window.addch(0x03C0) 
window.border0x03C0) 

... إنه ببساطة يجعل شيئا (الفضاء) في كل من بيثون 2.7 و 3.2.

التي يقالها - وظيفة addstr يفعل قبول السلاسل المشفرة UTF-8، ويعمل بشكل جيد:

window.addstr('π')

... ولكن بالنسبة للحدود - منذ border() يبدو مقابض الشخصيات بنفس الطريقة addch() هل - يبدو أننا بعيدين عن الحظ، لأي شيء غير محدد صراحة ك ACS ثابت (وليس هناك الكثير منهم، أيضا).

أمل أن هذا يساعد شخصاما،
هتافات!

يجب عليك تعيين المحلي الخاص بك للجميع، ثم ترميز الإخراج الخاص بك كما utf-8 كما يلي:

import curses
import locale

locale.setlocale(locale.LC_ALL, '')    # set your locale

scr = curses.initscr()
scr.clear()
scr.addstr(0, 0, u'\u3042'.encode('utf-8'))
scr.refresh()
# here implement simple code to wait for user input to quit
scr.endwin()

الإخراج: あ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top