classification
Title: curses line wrap broken when mixing full- and half-width unicode characters
Type: behavior Stage: test needed
Components: Library (Lib) Versions: Python 3.2, Python 3.3, Python 2.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: cabiad, ezio.melotti, fugounashi, vstinner
Priority: normal Keywords:

Created on 2009-08-19 00:43 by fugounashi, last changed 2015-04-14 13:10 by cabiad.

Messages (4)
msg91721 - (view) Author: (fugounashi) Date: 2009-08-19 00:43
when printing a full width unicode character near the end of a line when
only a single (half-width) space remains, the character is printed at
the start of the current line rather than the start of the next line. 
the following character is printed in the following space on the next
line as it should be.  same behaviour in both mlterm and xterm

thanks!

python deb 2.5.2-3
msg91986 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2009-08-26 22:42
Can you write a short example reproducing the bug?
msg92000 - (view) Author: (fugounashi) Date: 2009-08-27 11:53
thanks for looking into it

this should do it:

#! /usr/bin/python
import locale
locale.setlocale(locale.LC_ALL, '')
code = locale.getpreferredencoding()
import curses
def main(stdscr):
    stdscr.erase()
    stdscr.move(0, 0)
    for i in range(0,stdscr.getmaxyx()[1] - 1):
        stdscr.addstr(".");
    stdscr.addstr(u"\u3007\u3007".encode(code));
    stdscr.refresh()
curses.wrapper(main)
msg240877 - (view) Author: Chris Abiad (cabiad) Date: 2015-04-14 13:10
The original problem was described as:
"the character is printed at the start of the current line rather than the start of the next line."

I haven't gotten too far investigating the cause, but adding a single line to the sample code makes this test code a bit easier to use. Without a pause at the end of execution, my terminal immediately clears the screen making it impossible to see the output.

#! /usr/bin/python
import locale
locale.setlocale(locale.LC_ALL, '')
code = locale.getpreferredencoding()
import curses
def main(stdscr):
    stdscr.erase()
    stdscr.move(0, 0)
    for i in range(0,stdscr.getmaxyx()[1] - 1):
        stdscr.addstr(".");
    stdscr.addstr(u"\u3007\u3007".encode(code));
    stdscr.refresh()
    c = stdscr.getch()  # the new line
curses.wrapper(main)

Tested and reproduced on the following platforms:
1.
* XTerm(309) (NOTE: You must run `export LC_ALL=en_US.UTF-8` before non-ascii encodings will work at all in xterm)
* XQuartz 2.7.7
* Mac OS X 10.10.1

2.
* iTerm2 1.0.0.20130622
* Mac OS X 10.10.1

With each of the following python versions:
* 2.7.9
* 3.4.3
* Latest 'default' branch
History
Date User Action Args
2015-04-14 13:10:25cabiadsetnosy: + cabiad
messages: + msg240877
2011-11-19 14:12:04ezio.melottisetversions: + Python 3.3
2010-08-03 22:31:12terry.reedysetstage: test needed
versions: + Python 2.7, Python 3.2, - Python 2.5
2009-10-01 12:49:01ezio.melottisetnosy: + ezio.melotti
2009-10-01 05:09:45fugounashisetnosy: vstinner, fugounashi
components: + Library (Lib)
2009-08-27 11:53:54fugounashisetmessages: + msg92000
2009-08-26 22:42:35vstinnersetnosy: + vstinner
messages: + msg91986
2009-08-19 00:43:20fugounashicreate