파일이 utf8인지.. euckr인지 확인하는 방법 아시나요?

queryman의 이미지

갑자기 궁금해져서요;;;

전에 명령어로 확인할 수 있는것 같았는데 기억이 전무하네요;;;

어떤 파일이 utf8로 작성되었는지 euckr로 작성되었는지 확인하는 명령어나 다른 방법아시는분;;

공부삼아 ^^;;;

academic의 이미지

file 명령이 어떤 건 utf-8이라고 나타내주던데...

모든 utf-8 문서를 utf-8이라고 나타내주진 않더군요.

그래서 원하는 용도로는 사용이 안 될 것 같습니다.

--
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

junk11의 이미지

뭐 euc쪽은 그렇지만
utf-8이라면 첫3바이트로 구분할수 있지 않을까요?

-------------------------
내 악마를 영혼에게 팔아넘기다

klyx의 이미지

혹시 BOM을 말씀하시는 거라면, utf-8은 BOM이 있는 경우도 있고 없는 경우도 있습니다.
게다가 저만 그런건진 모르겠지만 BOM이 달린 utf-8문서는 본적이 없네요...

Necromancer의 이미지

BOM은 utf16, utf32일때만 해당됩니다. utf8은 해당사항 없습니다.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

academic의 이미지

MS 윈도우에서는 많이 볼 수 있습니다.

메모장에서 작성하면 BOM이 달리는 걸로 알고 있습니다.

--
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

Hyun의 이미지

먼저 아래 명령어로 utf-8 인코딩인지 먼저 검사합니다.

# iconv -f utf-8 -t ucs4 textfile.txt > /dev/null 2>&1
# echo $?

위 명령에서 실패했다면 cp949를 검사하죠.
# iconv -f cp949 -t ucs4 textfile.txt > /dev/null 2>&1
# echo $?

그다음 같은 방법으로 euckr로 검사합니다.

검사순서는 텍스트가 0x20부터 0x7f까지의 아스키로만 된 경우 utf-8로 판단하기 위함이구요... 필요하면 바꿔도 되죠.

참고로 바이트 모양이 같으면 cp949문서가 utf-8로도 판단될 수 있습니다. 이경우 텍스트가 깨졌는지 눈으로 보고 판단을 해야겠죠....

오호라의 이미지

용량이 크거나 파일이 많다면 특정부분만 짤라서 iconv 하시는게 좋을 듯합니다.

저도 귀찮아서 매번 그냥 스크립트로 UTF-8, EUC-KR, ASCII, EUC-JP ..등으로 iconv 하는데 은근히 시간걸리네요.

좀 화끈(?)한 방법이 있으면 좋으련만...

OTL

Hello World.

gamdora의 이미지

head가 출동하면 어떨까요?

head textfile.txt | iconv -f utf-8 -t ucs4 /dev/stdin >/dev/null 2>&1
echo $?

김정균의 이미지

euc-kr 에 대해서만 php 로 체크를 할 수 있도록 만들어 놓은 것이 있습니다. 다른 문자셋에 대해서는 고려를 하지 않은 관계로 .. 제 트랙백 처리에 사용을 하고 있습니다.

http://my.oops.org/62 참조 :-)

queryman의 이미지

답변들 고맙습니다. ㅎㅎ

제가 알고있던게 file인듯 싶네요... ;; 설마했지만.. 예전엔 다 되는듯 했는데 다 되는게 아니었나 봐요 ^^;
귀찮지만.. 일일이 확인하는 수밖엔;;

-------------------------------------------------------------------------------------------
생각은 지나가던 개새끼도 하지.. 실천하는건?? 나도 할수있지...
http://mrdics.tistory.com


-------------------------------------------------------------------------------------------
이놈의 IT 생활... 실증나고 짜증나고...
근데 왜 맨날 it관련 소식만 보고 ;;; 님휘

정태영의 이미지

mozilla 에서 나온 chardet 를 사용하는 방법도 있습니다. (c++)

이를 python 으로 포팅한 게 아래 녀석이구요.
http://chardet.feedparser.org/

찾아보시면 java 버젼도 있습니다.

--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

Necromancer의 이미지

완벽하게 구별하는 방법은 없고,

직접 구현하고자 하신다면 개별 문자들이 euckr이나 utf8로 해석되었을 경우
한글 영역 등에 맞는 경우가 발생하는 빈도를 가지고 판단을 해야 합니다.
좀 인공지능적인 개념이 들어가야죠.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

academic의 이미지

IBM의 ICU에서도 mozilla의 chardet과 같은 역할을 하는게 있습니다.

http://www.icu-project.org/

--
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

hongminhee의 이미지

윗분들이 말씀하셨다시피 UTF-8이든 EUC-KR이든 바이트열 포맷의 일종이고, 같은 바이트열에 대해 두 문자셋에서 모두 적법할 수 있습니다. 대개 그래서 적법성을 판단하기 보다는 Mozilla의 chardet처럼 해당 문자셋에서 통계적으로 잦은 조합들을 가지고(이를테면 EUC-KR은 한국어를 위해 많이 사용되므로, 한국어 문장에서 잦은 패턴들이 그대로 반영되겠죠) 패턴을 확인하는 식으로 추측합니다.

김정균의 이미지

2년여를 기다려도 icu 의 chardet 도 PHP 에서는 지원하지 않네요. 기다리다 지쳐서 mod_chardet 확장을 만들어 버렸습니다. ICU / Universal chardet(Mozilla) 둘다 지원합니다.

자세한 내용은 http://my.oops.org/126 을 참조하세요.

익명 사용자의 이미지

함수 크기를 좀 줄였으면, 하는데...줄일 수 있으시면, 줄여 주시면 감사하겠습니다.

//UTF8조건을 만족하는 2바이트 이상의 문자가 5개 이상 나오면, UTF8로 판단함.
int is_UTF8(char *s)
{
	int bUTF8=1;unsigned int a;unsigned char *p;
 
	p=(unsigned char *)s;
	while(*p)
	{
		a=*p;
		if(a&0x80)
		{
			if((a&0xE0)==0xC0)
			{
				a=p[1];
				if((a&0xC0)==0x80)
				{
					bUTF8++;//UTF8일것이다.
					if(bUTF8>5)
					{
						break;//UTF8
					}
					p+=2;
				}
				else
				{
					bUTF8=0;
					break;//UTF8이 아님
				}
			}
			else if((a&0xF0)==0xE0)
			{
				a=p[1];
				if((a&0xC0)==0x80)
				{
					a=p[2];
					if((a&0xC0)==0x80)
					{
						bUTF8++;//UTF8일것이다.
						if(bUTF8>5)
						{
							break;//UTF8
						}
						p+=3;
					}
					else
					{
						bUTF8=0;
						break;//UTF8이 아님
					}
				}
				else
				{
					bUTF8=0;
					break;//UTF8이 아님
				}
			}
			else if((a&0xF8)==0xF0)
			{
				a=p[1];
				if((a&0xC0)==0x80)
				{
					a=p[2];
					if((a&0xC0)==0x80)
					{
						a=p[3];
						if((a&0xC0)==0x80)
						{
							bUTF8++;//UTF8일것이다.
							if(bUTF8>5)
							{
								break;//UTF8
							}
							p+=4;
						}
						else
						{
							bUTF8=0;
							break;//UTF8이 아님
						}
					}
					else
					{
						bUTF8=0;
						break;//UTF8이 아님
					}
				}
				else
				{
					bUTF8=0;
					break;//UTF8이 아님
				}
			}
			else
			{
				bUTF8=0;
				break;//UTF8이 아님
			}
		}
		else
		{
			p++;//ascii
		}
	}
	return bUTF8;
}

댓글 달기

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