-
-
Notifications
You must be signed in to change notification settings - Fork 30.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Patch: new method get_wch for ncurses bindings: accept wide characters (unicode) #51004
Comments
Currently,there is no a simple way in curses bindings to get the code getch returns the code for a wide character byte a byte. Patch against Python v2.6.2 to provide this missing get_wch method Include a test example and a patch to the documentation as well. More info and a partial solution without patching python curses module |
Added patch for the documentation |
Added test example |
Added missing file: patch against Python v2.6.2 |
Added patch against Python v3.1.1. |
Have you looked into bpo-700921 already ? It seems a lot of discussion |
Thanks for the pointer, haven't seen anything when I searched for get_wch. The patch provided here only adds this get_wch function, because as A.M. |
Nice. 2 questions:
|
Q. Why not change getch() to always use get_wch()? This could break backwards compatibility. Q. I think you also want fix getkey() / introduce get_wkey(). In my own experience get_wkey isn't be as useful when dealing with wide |
Btw, I don't know if this is the best place to comment it but as it is Other functions I miss a lot are wcwidth() and wcswidth(). These functions return the real width (read, cells length in screen) for An example to clarify the issue: one simple Chinese character could need i.e., len(chinese_unicode_string) != wcswidth(chinese_unicode_string) Those functions are included into not so old glibc versions (2.2+?), at Sadly enough, python doesn't bind them, afaik. Please look at these files:
I think Python could benefit from having these functions in the standard Neither do I know where they fit... perhaps in unicodedata module. What do you think? who is the person to convince? (please, don't ask me |
For the title concern of this patch I'm adding akuchling as nosy. Judging by your post your English probably is good enough to write a PEP As for where to raise the (new) issue...given that these functions are I'm setting the stage to test needed since your test case isn't a unit |
inigoserna>> Other functions I miss a lot are wcwidth() and wcswidth() I wrote a patch to implement unicode.width() method: It's part of the issue bpo-2382 (SyntaxError cursor shifted if multibyte |
Will this be part of 3.2 and possibly 2.7? Without these patches wide character input using curses is basically impossible (on at least some platforms). |
Is there any hope that something like this patch will make it into a future version? As far as I can see, entering accented characters is currently impossible on the latest release versions of python...or am I missing something? |
Can someone update the patch for Python 3.3? Python 2.7 and 3.2 don't accept new features. |
The bug is marked "Test Needed". I am very keen to see this issue fixed, and would be very willing to help, but I don't really know what is still required. As far as I can see there is a patch waiting - what is the hold up? |
New changeset dec10ad41b2a by Victor Stinner in branch 'default': |
_cursesmodule.311.get_wch.patch doesn't apply correctly on Python 3.3 and use PyInt_FromLong() function, function removed from Python 3.0. Indeed, Iñigo wrote that the patch was not tested.
Nobody wanted to take the responsability of the choice for get_wch(): add a new method or patch getch() ;-) -- I commited Iñigo's patch to add window.get_wch() method with minor changes:
-- I think that the Unicode support of curses in Python 3 is just completly broken: I opened a new issue for that, issue bpo-12567. I also create the issue bpo-12568 to add a function to get the width of a character. |
I suspect that a new method is the right way to go, here. I see it has been moved to "committed/rejected" status - does that mean that it might still go in, or that it is rejected?
It certainly is less than ideal. ;-) |
I commited the new method, did you see my commit dec10ad41b2a? I propose to continue the discussion on issue bpo-12567 (for example, to decide if we need unget_wch or not). |
/home/antoine/cpython/default/Modules/_cursesmodule.c: In function ‘PyCursesWindow_Get_WCh’: Failed to build these modules: |
Also compilation warnings on some buildbots: /var/lib/buildslave/3.x.murray-gentoo-wide/build/Modules/_cursesmodule.c: In function 'PyCursesWindow_Get_WCh': |
Oh oh, I expected such error: it means that your ncurses library don't have the wide character API. The compiler command confirm that: "gcc ... -lncurses ...". You use libncurses and not libncursesw. Antoine told me that libncursesw is available on its OS, but Python chose libncurses. I suppose that it's because readline is linked to libncurses (and not libncursesw) => see issue bpo-7384. Antoine setup is not rare: many Linux distro link readline to libncurses, and so Python cannot use libncursesw. For this issue, it's not a problem: we can just add a test to check if get_wch is available or not, and only define the Python function if the C function does exist. But for bpo-12567, it's a bigger problem because it means that we cannot always use the wide character functions if the argument is Unicode (character/string). |
See also the issue bpo-9408. |
curses_unicode.patch of issue bpo-12567 adds a HAVE_NCURSESW define to only use wide character functions if _curses is linked to libncursesw. This define can be used to fix this bug (use wget_ch whereas it is not available). |
I have compiled ncurses myself, supporting wide characters. I get this warnings in the buildbots: """ Studying the "ncurses.h", I see the definition of "wget_wch" and others. But these definitions are created only if "_XOPEN_SOURCE_EXTENDED" is defined. Something to be explored?. |
I hope that this is the right bug to file this on (I'm getting lost in all of the curses bugs!). I'm testing out the 3.3a1, and I've run into the following issue. On previous releases addch() could accept curses.ACS_HLINE and similar. Attempting to use the same code now raises the exception: OverflowError: byte doesn't fit in chtype. I'm sure this is related to the new code that uses addwstr(), but currently code that used to work will crash. I can't work out a fix myself, because I don't fully understand the problem, but I'm happy to provide sample code if it will help. Nicholas |
Since this bug is about adding a new feature, it is unlikely to be the correct bug for this to be against. Given that you've identified a regression, I suggest you open a new bug with a reproducer, and we'll set it to release blocker. |
On Wed, Mar 7, 2012 at 7:40 AM, R. David Murray <report@bugs.python.org> wrote:
I've created bpo-14223. I hope I've done so correctly. Best wishes, Nicholas |
Antoine's issue has been fixed: It looks like Jesús's issue is specific to Solaris (or is already fixed?), and so I added a comment to the issue bpo-13552: "Modules/_cursesmodule.c:920: warning: implicit declaration of function 'wget_wch'". |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: