UTF-8 환경 표준 입력시 한글 백스페이스 처리?

imyejin의 이미지

이 글에서는 표준 입력을 line buffer 모드로 사용하는 것을 가정하겠습니다. (그게 기본 설정이기도 하죠.)

예를 들면 리눅스에서 bash상에서는 한글로 치다가 백스페이스로 지우면 실제로 버퍼에서도 한글 글자 하나가 통째로 지워지고 실제로 화면에서도 그렇게 보입니다.
그런데, 예를 들면 C++ 프로그램에서 std::cin 으로 한 줄 입력을 받는 중에 백스페이스로 지우면 버퍼에서는 한글 글자 하나가 통째로 지워지는데 화면에서는 글자가 반만 지워진 것으로 보여서 백스페이스를 두 번 눌러서 화면에 나타난 글자를 지우면 실제 버퍼에서는 내부적으로 두 글자가 지워져서 나옵니다.
(C++ 말고 다른 프로그래밍 언어에서 표준 입출력을 사용해도 마찬가지였습니다. 뭐 표준 입출력이 glibc 바인딩을 사용할 테니 당연한 거겠지만 ...)

bash라던가 파이썬 등 인터프리터 환경(인터프리터 환경에서는 제대로 되지만 sys.stdin.readline() 표준 입출력 함수로 문자열 입력을 받을 땐 같은 문제 발생)에서는 이걸 제대로 처리하는 걸 보면 뭔가 이걸 처리해 주는 라이브러리나 그런 게 있을텐데, 어떤 방법을 써야 하나요?

아직까지도 국제화를 충실히 지원하는 디지털 환경은 갈 길이 머네요. 이렇게 기본적이고 사소하고 당연히 되어야 할 것들도 아직 기본적인 라이브러리 기본 설정에서 제대로 동작하지 않고 따로 방법을 찾아야 하니 ...

@ 참고로 제가 사용하는 리눅스 환경은 다음과 같습니다.
$ uname -a
Linux kyavaio 2.6.29-2-686 #1 SMP Sun May 17 17:56:29 UTC 2009 i686 GNU/Linux
$ set|grep ^LANG
LANG=ko_KR.UTF-8

imyejin의 이미지

readline 라이브러리를 사용하면 된다는 건 압니다만, GPL을 사용할 생각이 아니라거나, 아니면 readline의 히스토리 기능이 필요한 게 아니라 그냥 백스페이스만 제대로 먹으면 되는 건데 굳이 readline에 의존하기 싫다면 다른 방법이 없는지 궁금합니다.

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

송효진의 이미지

잘은 모르지만,
readline 과 같은 기능을 하는 libedit 라는 것이 있습니다.
bsd 네요.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇 개 안돼요~
http://xenosi.de/

imyejin의 이미지

libedit는 제가 원하는 것과 반대쪽 그러니까 readline의 히스토리 기능만 있는 GPL이 아닌 간단한 readline인데, 문제는 제가 알기로 아직 libedit는 멀티바이트 문자를 전혀 지원하지 않는 것으로 알고 있습니다. 하스켈 컴파일러인 GHC가 라이센스 문제 때문에 readline에서 libedit로 전환한 다음에 한글이 ghci 프롬프트에서 바로 저 문제가 발생하게 되었기 때문에 좀 짜증이 나는 관계로 알고 있죠 -_-;;;

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

송효진의 이미지

libedit 가 2006년도 이후로 업데이트도 없군요.-_-;
php 에 붙일 수 있길래 간단히 테스트 해 봤더니, '테스트'라는 글을 입력하는 것 조차 안되네요.
'스' 를 치는 순간 화면이 클리어 되어 버립니다.-_-;;;;;;

readline 은 아주 깔끔하군요.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇 개 안돼요~
http://xenosi.de/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.