한글 파일이름을 인코딩을 어떻게 하나요? iconv 든 convmv 이든
글쓴이: initiative / 작성시간: 화, 2004/05/25 - 2:49오후
안냐세요..
물론 게시판을 뒤져봤지요.
이것 저것 아침부터 지지고 복고 심지어 쉘 스크립트까지 돌렸다니까요.(이때는 convmv 로 만들어 돌림.)
근데 여가 보니 iconv 를 사용하라고 되어 있는뎅..
아래와 같이
:b1:c7:b5:ce:c5:c3.doc 파일의 파일이름을 좀 제대로 보기위해서 바꿔야하는 거죠.
iconv -c -f utf-8 -t euc-kr :b1:c7:b5:ce:c5:c3.doc
이렇게 해보면 콘솔에 이상한 문자들만 가득하고 파일이름은 안바뀝니다.
어케해야할지요?
참고로 ext2로 되어 있고 locale 은 euc-kr 임다.ㅣ
제발... :oops:
Forums:
참고로 iconv는 파일 내용을 읽어 변환하여 출력할 때 사용하는 프로그
참고로 iconv는 파일 내용을 읽어 변환하여 출력할 때 사용하는 프로그램입니다.
한글 입출력이 되는 터미널에서 ls 권두택.doc 하시면 뭐라고 나오나요..?
제가 원하는 것이 바로 그 권두택이라는 파일이름을 얻는 방뻡
제가 원하는 것이 바로 그 권두택이라는 파일이름을 얻는 방뻡입니다!!
어떻게 권두택이라는 파일이름을 얻었는지요?
그거 알면 됩니다.
파일 내용은 알 필요가 없구요.
리눅스 특정 디스크(딴데서 붙여온거) 의 모든 디렉토리의 모든 파일이름이 위와 같이 030714_:c3:ca:b1:e2:c8:ad:b8?.vsd
이런 식으로 다 바뀌어서 볼 수 가 없습니다.
제발 ...
With Everlasting Passion about new Tech. and Information!
터미널에서 한글 입출력이 되기만 하면 해결되지 않을까 짐작이 가는데요..
터미널에서 한글 입출력이 되기만 하면 해결되지 않을까 짐작이 가는데요.. 터미널에서 한글 입출력이 되는 것은 확실한가요?
혹시 bash를 쓰시면 ~/.inputrc 파일 안에 다음과 같은 내용을 넣어봐주세요.
set input-meta On
set output-meta On
set convert-meta Off
그 후 로그아웃 하시고 다시 로그인 하시고 ls 해보시면..?
덧. 제가 파일 이름을 얻은 방법은 별로 바람직하지 않은 방법이라 권해드리고 싶지 않습니다.
Re: 한글 파일이름을 인코딩을 어떻게 하나요? iconv 든 convmv
iconv와는 별 관계 없습니다.
urlencode 형식입니다.
다른 점이라면 %대신 :이 쓰였다는 점 정도구요.
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Code_C_urlencode
를 약간 수정하시면 잘 될겁니다.
urlencode는
[a-zA-Z\.\-_]를 제외한 모든 문자를 %[HEX VALUE]형식으로
치환해서 표현합니다.
개인적으로 테스트 해봤는데 잘되네요.
ps.
권두택.doc
캄사.
모두들 감사합니다..
한 번 다시 구워삶아 보지여..
:lol:
With Everlasting Passion about new Tech. and Information!
흑흑
알려주신대로
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Code_C_urlencode
의 함수를 참고하여 아래와 같이 바꿔주고 리눅스에서 돌렸습죠.
int main(int argc, char **argv)
{
int i, n;
unsigned char dest[256] = {0x00,};
unsigned char test[256] = {0x00,};
// unsigned char *str = "hello world 안녕하세요\n";
// unsigned char *str2 = "hello\%20world\%20\%be\%c8";
unsigned char *str2=":b1:c7:b5:ce:c5:c3.doc";
printf("Original : %d %s\n", strlen(str2), str2);
n = urlencode(str2, dest);
printf("decode : %d %s\n", n, dest);
n = urldecode(str2, test);
printf("encode : %d %s\n", n, test);
return 0;
}
결과가
./test
Original : 22 :b1:c7:b5:ce:c5:c3.doc
decode : 34 %3Ab1%3Ac7%3Ab5%3Ace%3Ac5%3Ac3.doc
encode : 22 :b1:c7:b5:ce:c5:c3.doc
흑흑..
encode 는 변화없고 decode 도 이상하군요.
말씀하신대로 타켓 문자가 :이라 그런것인지..
웅,..
***
글고 검은해님
.inputrc
파일에그렇게 써넣고
제가 삼바로 네트워크드라이브 공유해서 윈도우즈탐색기로 보아도
한글이 깨져있지 않고 잘 보인다는 말씀인가요?
웅.이건 아직 테스트는 안해봤습니다만..
With Everlasting Passion about new Tech. and Information!
글고 알려주신것은 urlencode 아닙니깡?GET혹은 POST방
글고 알려주신것은 urlencode 아닙니깡?
GET혹은 POST방식으로 전달되는 URL 문자열을 인코딩하거나 디코딩 한다.
이라고 나와있는뎅..
전 그냥 문자열 인코딩인뎅....
웅.. :(
With Everlasting Passion about new Tech. and Information!
[quote="initiative"]글고 알려주신것은 urlencode
urlencode 맞습니다.
그러한 방식으로 인코딩되었다는 의미입니다.
%대신 :이 쓰였다는 점 정도가 다르구요..
위에 코드 예제는 %를 기준으로 한것이니..
당연히 그대로 돌리면 안되구요. %를 :로 코드를 수정한다음
돌려야 합니다.
[quote="검은해"]참고로 iconv는 파일 내용을 읽어 변환하여 출
iconv 는.. 파일 내용을 읽어 변환하여 출력할때만 이용할 수 있는건 아닙니다 :)
echo "한글" | iconv -f euc-kr -t utf-8
이런 식으로 euc-kr -> utf-8 로 바로 변환하는 것도 가능하며..
조금 응용하면..
식으로.. euc-kr로 된 파일이름을 utf-8로 변환하는 것도 가능합니다 =3=33
(물론 저렇게 하면 무조건 파일이름이 euc-kr로 되어있었다고 가정하지만요 -_-;;
echo -e 를 이용해서 \숫자\숫자 식으로 되있는 파일명이 되었을때
저런식으로 했던기억이 나서 =3=33
슈슝 즐거운 하루 되세요
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
[quote="initiative"]제가 원하는 것이 바로 그 권두택이라
딴데서 붙여온 디스크가 ntfs 혹은 vfat 혹은.. iso9660 입니까..?
그렇다면..
마운트 할때 옵션으로..
-o iocharset=cp949,codepage=949
를 줘보시기 바랍니다 :D
삼바 서버를 설정할때.. 코드페이지를 cp949로 해주면..
별 문제 없이 잘됩니다 ;)
단.. 원본 파일명이 리눅스에서 정상적으로 보일때 얘기지만요..
_-_
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
Re: 한글 파일이름을 인코딩을 어떻게 하나요? iconv 든 convmv
이런 파일 이름이 어떻게 해서 생기게 되었는지를 알면 간단히 해결될 문제로 보이는데요?
그냥 16진수 변환만 차례대로 하면 한글 이름으로 돌아가는 것 아닌가요?
석가탄신일 지나고 왔더니 많은 답글이 올라와있네용..
:o
모두들 감사드리구요..
자 오늘 하나씩 하나씩 차근차근이 해보겠습니다.
역쉬 케이엘디비가 짱이군요!.
:P :P
With Everlasting Passion about new Tech. and Information!
근데 어떤 이유로 한글이 :c2:b2 ~ 이런식으로 바뀌게 된걸까요?
:을 %로 바꾸고 디코딩하니까 제대로 됩니다.
근데 근본적인 이유를 알면 더 쉽게 접근할 수 있을거 같은데.
어떤원인으로 한글이름들이 저렇게 바뀐것일까요?
char 가 저장될 때 아스키값으로 저장되잖아요?
이게 아스키값으로 바뀌어서 이름이 되어 있는데 그렇다면 이녀석들을
한방에 원래대로 바꿀려면 어떻게 해야할까요?
전 여기에 생각이 미쳐 아래처럼
>convmv --notest -f ascii -t euc-kr 파일제목
하면 Ready! 라고만 나오고 변하지는 않고..
일일이 바꿀수도 없고..
:?:
With Everlasting Passion about new Tech. and Information!
http://server.hongik.ac.kr/Src/urlquote/
http://server.hongik.ac.kr/Src/urlquote/
예전에 짜놨던 요녀석을 사용해봤습니다 :D
만약 유니코드 환경이라면 맨 뒤에.. iconv -f euc-kr -t utf-8 이 붙음 완벽해질듯 하군요 :D
흐흐 대강 이런식이면 되는거죠 =3=33
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
앗..
움..
한번 해봐야징...
잠깐만요..
:roll:
With Everlasting Passion about new Tech. and Information!
답변 감사합니다.
드디어 거의 해결 기미가 보입니다.
쉘을 만들어서 알려주신 그 구문들을 넣었습니당.
작업디렉토리에 대상파일들도 넣고 같은 디렉토리에 url_decode 도 넣구..
아래와 같이 resolve.sh에.
최종목표는 그 깨진파일들을 제대로된 이름으로 모두 "이름 변경"하는 것이기에 아래 결과($NEW) 을 하나씩 mv 하려고 합니다.
근데 그 전에 $NEW의 결과를 보면
%b1%c7%b5%ce%c5%c3.doc : 권두택.doc
이렇게 나오는데 제가 필요한거는 뒤의 권두택.doc 만 알면 됩니다.
이걸로 mv 로 바꿀라는 거죠.
>NEW=`echo $X | sed -e "s/:/%/g" | xargs ./url_decode`
이것을 필요한 아웃풋만 받게 하면 될 텐데요.
위의 문장을 어떻게 짤라야 할지 감이 안잡히네요..
근데 잘 안되네요..
제가 스크립트에 익숙치 않아서요..
:?
With Everlasting Passion about new Tech. and Information!
Re: 답변 감사합니다.
NEW=`echo $X | sed -e "s/:/%/g" | xargs ./url_decode | awk '{ print $3 }'`
단, 위의 방법은 파일 명에 공백문자가 들어가면 쓰실 수 없습니다. 제대로 하려면 urldecode가 "디코딩된이름"만 출력하도록 수정하신 후
NEW=`echo "$X" | sed -e "s/:/%/g" | xargs ./url_decode`
mv "$X" "$NEW"를 하시면 될 것 같습니다.
Re: 답변 감사합니다.
아니요..
디코딩된이름에서 스페이스나 특수문자를 익스케잎까지 시켜줘야 합니다 =3=33
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
decode 함수의 아웃풋을 바꿔서 해결을 했지요. 근데 디렉토리마
url_decode.c 의 아웃풋을 변경된 놈만 던지게 바꾸었습니다.
그게 더 편하더군요. -.- 생각을 좀 바꿔보는 거였는데 괜히 그걸 파일로 뽑아내
느라 고생만..
다음 스크립트에서 #은 그걸생각못하고 별도로 뽑아낸거고..
#!/bin/bash
for X in *;
do
NEW=`echo $X | sed -e "s/:/%/g" | xargs ./url_decode`
echo $NEW;
#file 에 저장
#out_file=./outfile
# iecho "$NEW" > $out_file;
#FILENAME=`awk '{print $3}' $out_file`
#echo "$FILENAME";
#echo "$PWD/$X";
# rename filename
#mv $X $FILENAME;
mv $X $NEW;
# remove out_file
#rm $out_file;
done
~
~
~
암튼 일케 하여 깨진 파일(들)이 위치한 데다가 url_decode 와 resolve.sh 을 놓고 스크립트를 실행시키니 대부분 제대로 한글이름으로 원복되었지요!!
근데 새는 녀석들도 있더이다.
05.:bf:b9:bb:f3:bd:c5:b1:d4 :c7:c1:b7:ce:c1:a7:c6:ae 이런놈.
많이 해결이 되었습니다.
마지막 남은 문제는 이 스크립트는 해당디렉토리만 검색하여 치환한다는 겁니다.
하위 디렉토리까지 검색을 못하니 현재디렉토리만 처리하여줍니다.
만일 디렉토리가 1000개로 세분화되어있다면(실제로 제 하드가 거의그러함)
1000번의 스크립트를 실행하여야 하는것이죠..문젭니다.
그래서 얘를 최상위 디렉토리에다가 위치시키고 실행시키면
하위 디렉토리를 loop 를 돌면서 순서대로 바꿔나가게 하면 될것 같다는 데 생각이 당근 미쳤지만...
좋은 방법을 모르겠습니다.
거의 다 해결을 했습니다. 이 방법만 알면 아주 손쉽게 모든 디렉토리를 한방에 다 바꿀수 있을 거 같습니다만... :)
With Everlasting Passion about new Tech. and Information!
for x in * 를for x in `find . -type f`
for x in * 를
for x in `find . -type f` 로 바꿔보시기 바랍니다.
man find
--feanor
[quote="initiative"]05.:bf:b9:bb:f3:bd:c
05.예상신규 프로젝트
파일 이름에 빈칸이 있어서 그런가보네요..
NEW=`echo "$X" | sed -e "s/:/%/g" | sed -e "s/ /%20/g" | xargs ./url_decode`
mv "$X" "$NEW" 이렇게 하시면 혹시 도움이 될까요? 제가 xargs를 써본 경험이 없어서 어디를 더 눈여겨봐야 할지는 잘 모르겠어요..Re: decode 함수의 아웃풋을 바꿔서 해결을 했지요. 근데 디렉토
하위 디렉토리 까지 뒤지는건
다른 분이 대답해주셨듯이.. find로 대체 하면 되겠구요 :)
mv $X $NEW;
를.mv "$X" "$NEW";
로 바꿔주면 공백문제는 아마 해결될겁니다 :)오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
음..
공백문제가 해결이 안됩니다..
mv "$X" "$NEW" 에서
두번 째("$NEW") 을 적용하면
파일과 디렉토리의 앞에 빈 공백이 붙습니다.
예를 들어 12. :c0:af:c1:f6:ba:b8:bc?
를 대상으로 한다면 "(공백)12. 유지보수" 로 나와버리지요.
몇번을 해봐도 그래서 전 "$X" 에 대하여만 쿼테이션으로 묶고 돌리는데..
암튼 그건 그렇구..
가장 큰 문제는 빈 스페이스를 포함한 파일/디렉토리는 디코딩을 못한다는 겁니다! 암만해도 url.c 를 손봐야 할 듯한데...
01. SKT-:b1:b8:bc:ba:b0:fc:b8:ae
15. TM :c4:c1:bc:b3:c6:c3
이런 넘들..
최상위 디렉토리에 놓고 돌려도 빈 스페이스를 포함한 디렉토리는 아예 건너 뜁니다.
어찌 해결을 해야할는지요..
음..쉬운게 없군요.. :?
With Everlasting Passion about new Tech. and Information!
[완결판]
많은 분의 도움으로 이 문제를 한 달 전에 해결을 보았습니다.
아래와 같은 res.sh 파일을 만들었어요.
#!/bin/sh
for X in *;
#for X in `find . -type f`
do
NEW=`echo $X | sed -e "s/:/%/g" -e "s/ /__/g" | xargs url_decode`
NEW=`echo $NEW | sed -e "s/__/ /g"`
echo $NEW;
#ls "$NEW"
mv "$X" "$NEW";
done
그간 도움 주시분께 진심으로 감사드립니다.
늦었지만 꼭 말씀드리고 싶어서요..
With Everlasting Passion about new Tech. and Information!
Re: [완결판]
이렇게 하시는 것도 가능합니다:
utf8 형태로 되어 있다면 piconv (perl-5.8 이상) 또는 iconv 를 불러다 쓰시면 되겠구요..
War doesnt determine whos right, just whos left.
넵. 또한 감사드립니다.
넵.
또한 감사드립니다.
With Everlasting Passion about new Tech. and Information!
Re: 근데 어떤 이유로 한글이 :c2:b2 ~ 이런식으로 바뀌게 된걸
char가 꼭 ASCII값이어야 할 이유는 없습니다.
char는 그냥 한 바이트를 담는 그릇일 뿐이죠.
댓글 달기