자바 listFiles() 로 한글 파일이름 읽기?

shkim의 이미지

리눅스 콘솔 모드에서 한글 관련 프로그램을 테스트중입니다.

System.out.println("한글");
이 ??로 출력되던 문제는 java 기동시에 -Dfile.encoding=ksc5601 을 주어서 해결하였는데

File.listFiles() 메소드가 한글 파일 이름을 ???로 얻어오는 문제는
아무리 수를 써봐도 해결할 수가 없었습니다.

String fn = children[i].getName();
String n2 = new String(fn.getBytes(), "ksc5601");
System.out.println(fn + ":"+ n2);

위처럼 ksc5601 등 각종 encoding 을 바꿔보아도 ??로만 출력됩니다.
한글 파일이름의 해결책이 있을까요?

참고로 파일 이름은 ls 쳐서 잘 나오고 파티션은 linux native ext3 입니다.

atdda의 이미지

시스템에서 쓰고 계시는 캐릭터 셋은 무엇인가요? (locale)

new String(fn.getBytes(디폴트 인코딩), 새로운 인코딩) 이런 방식으로 우선 디코딩을 해당 로케일에 맞게 잘 해주셔야합니다.

위의 ksc5601로 맞춰진 것은 java source 파일의 "한글" 이라는 문자를 인식하는 방식인 것 같네요.
둘이 조금 다릅니다.

생각해보니,
File.listFiles는 FileSystem Class (native) 구현에서 처리될 것 같군요.
좀 아리송하네요.

-D 옵션으로 System.out.println("한글") 문제를 해결하시는 것 보다는,
java 파일 저장하실 때, 한글 정보가 잘 들어갈 수 있도록 저장하시는게 편하실텐데요. :)

미심쩍어서 제 테스트 박스에서 해봤더니 굳이 캐릭터 셋 조절하지 않아도 잘되네요.

해결하시면 알려주세요. :)

May The Force Be With You.

May The Force Be With You.

shkim의 이미지

ubuntu 6.06 어제 새로 깔은 시스템인데
영문판이라 그런지 한글관련 셋팅은 꽝이네요..
인코딩이 무엇인지 잘 몰라서

http://java.sun.com/j2se/1.4.2/docs/guide/intl/encoding.doc.html

를 참고해서 다음과 같은 코드를 돌려봤지만
여전히 한글 파일이름은 ?? 로 나옵니다..

        public static void TestOut(String fn) throws Exception
        {
                final String encs[] = { "UTF-8", "ASCII","EUC-KR","ISO-2022-KR", "x-windows-949", "ISO-8859-1", "ksc5601", "Cp949", "Cp437" };
 
                for(int a=0; a<encs.length; a++)
                {
                        for(int b=0; b<encs.length; b++)
                        {
                                String s = new String(fn.getBytes(encs[a]), encs[b]);
                                System.out.println(fn + "(" + encs[a] + "->" + encs[b] + "):" + s);
                        }
                }
        }

윈도우에선 listFiles 가 잘 되는데, 슬슬 짜증이 나기 시작하는군요..
atdda의 이미지

제 박스도 우분투입니다. :)
저는 잘 되네요.

제 글이 좀 애매하긴 하군요.

File.listFiles 하면 FileSystem에서 File instance를 생성하기 때문에 디폴트 캐릭터 셋으로 설정되어 나올껍니다.
한테 shkim님이 -Dfile.encoding=ksc5601 옵션으로 인코딩을 바꾸셔서 이 부분이 다르게 들어갈 것 같네요.
이렇게 하면, (정확하지는 않습니다만) 시스템 디폴트 캐릭터 셋으로 된 바이트를, ksc5601로 인식해서 인코딩을 할껍니다.
locale이 ksc5601이면 문제 없겠지만, 다른 것이라면 정보가 손상될 수 있을 겁니다.

한번 -D 옵션을 해제하고 해보세요.

locale은 터미널에서 locale 치시면 확인하실 수 있습니다.
제껀 UTF-8 입니다. :)

May The Force Be With You.

May The Force Be With You.

shkim의 이미지

LANG,LC_ALL 등의 환경변수를 ko_KR.eucKR 로 바꿨는데, locale 결과는 다음과 같습니다.

shkim@ubuntu:~/test$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=ko_KR.eucKR
LANGUAGE=ko
LC_CTYPE="ko_KR.eucKR"
LC_NUMERIC="ko_KR.eucKR"
LC_TIME="ko_KR.eucKR"
LC_COLLATE="ko_KR.eucKR"
LC_MONETARY="ko_KR.eucKR"
LC_MESSAGES="ko_KR.eucKR"
LC_PAPER="ko_KR.eucKR"
LC_NAME="ko_KR.eucKR"
LC_ADDRESS="ko_KR.eucKR"
LC_TELEPHONE="ko_KR.eucKR"
LC_MEASUREMENT="ko_KR.eucKR"
LC_IDENTIFICATION="ko_KR.eucKR"
LC_ALL=ko_KR.eucKR

윈도에서 putty 를 쓰는데 이것이 아마 유니코드 터미날이 아닌것으로 알고 있습니다.
java -D 옵션은 안써도 결과는 ?? 이고요 println 에서 그나마 출력되던 한글도 아예 안나옵니다.

한글에 관해서 리눅스와 자바는 언제나 말썽이네요.. -_-
그래도 회사일이 아니라서 다행.. 그만 잠시 접어둬야 할것 같아요.

manea의 이미지

저같은경우엔 eucKR과 UTF-8방식의 차이때문에 엄청 고생했었습니다. 파일시스템도 이상없고 파일명도 이상없구요, JAVA도 이상없고 각자의 인코딩도 이상없습니다. 지금 문제의 차이는 서로 인코딩이 안맞아서 그런것 같네요. 파일시스템을 UTF-8로 바꾸시는 방법이 가장 편한 방법일듯 하네요 ^^; 하지만 해결 들어갈 문제가 한두게는 아니죠.. 머리아파집니다.. ㅡㅜ.. JAVA를 최신버전으로 한번 해보시면 어떨지 ^^;
열정!! ^^

열정!! ^^

manea의 이미지

저같은경우엔 eucKR과 UTF-8방식의 차이때문에 엄청 고생했었습니다. 파일시스템도 이상없고 파일명도 이상없구요, JAVA도 이상없고 각자의 인코딩도 이상없습니다. 지금 문제의 차이는 서로 인코딩이 안맞아서 그런것 같네요. 파일시스템을 UTF-8로 바꾸시는 방법이 가장 편한 방법일듯 하네요 ^^; 하지만 해결 들어갈 문제가 한두게는 아니죠.. 머리아파집니다.. ㅡㅜ.. JAVA를 최신버전으로 한번 해보시면 어떨지 ^^;
열정!! ^^

열정!! ^^

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

UTF-8로 돌려놓으시고, putty에 보면 인코딩을 UTF-8로 바꾸는 설정이 있습니다. 잘 찾아보세요 ;)

dormael의 이미지

자바만 그런것은 아닐테지만 문자열 인코딩은 모든 부분에서 문제가 발생할 수 있습니다.

1. 파일시스템(파일 시스템에서 읽어오는 파일명) 혹은 파일(파일 내부에 저장된 문자열의 인코딩) - 입력이라고 보면 될라나요?
2. 입력을 읽는 코드
3. 읽어온 데이터를 출력하는 코드
4. 출력을 보여주는 코드 혹은 환경

이 외에 다른 소프트웨어(DBMS같은)와의 입/출력 부분도 있습니다.

자바(java/jre)에서 2,3 은 기본설정(설정 없음)에서는 현재 환경의 기본 문자열 코딩(적절하게 설정되어 있다면)을 쓰는것으로 알고 있습니다.
소스코드 내의 문자열 코딩도 컴파일시에 이 설정에 따르고요.

문제는 1과 2/3, 4와 2/3이 하나라도 맞지 않을경우 결과적으로 보이는 내용이 알아볼 수 없게 되는 상황이 발생합니다.

만일 모두 기본 설정 상태(아마도 utf8 인코딩이 아닐까 합니다.)이고,
ubuntu가 설치된 파일시스템 로컬상에서 디렉토리나 파일을 만드시고,
로컬의 gnome터미널 상에서 소스를 컴파일 하고 실행하시면 파일명이 제대로 출력될 가능성이 매우 높습니다.

이와 관련된 환경들을 자세히 알려 주시면 누군가 도와 드릴 수 있을겁니다.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

anabaral의 이미지

부랴부랴~~~

부랴부랴~~~

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.