gcc 에서 UTF-8 with BOM 로 된 소스파일 컴파일 하기

B00m의 이미지

현재 한글 text 를 처리하는 프로그램을 C++로 만들고 있습니다.

내부적으로 wchar_t 타입으로 로 문자들을 처리하고 있습니다.

프로그램은 리눅스와 윈도우에서 돌아가고 있고, 같은 소스를 가지고 gcc 와 VC8 로 컴파일하고 있습니다.

그런데 예를 들어 다음과 같은 소스를 컴파일 할때

const wchar_t* s = L"안녕하세요";

VC8 같은 경우는 utf-8 혹은 로컬인코딩된 소스 모두 컴파일이 가능합니다.

그런데 gcc 같은 경우는 utf-8인 소스 파일만 컴파일이 가능하다는 것을 알았습니다.

그래서 소스 파일을 utf-8 로 저장하기로 했는데,

문제는 gcc 같은 경우는 소스 파일에 BOM 이 포함 안되어 있어야 하고 VC8 같은 경우는 포함되어 있어야 합니다. (VC8 같은 경우 포함 안되어 있으면 그냥 로컬인코딩으로 취급하기 때문에 문제가 있습니다)

gcc 같은 경우는 BOM 코드를 알수 없는 문자라고 다음과 같은 에러를 냅니다.

a.cpp:1: error: stray '\357' in program
a.cpp:1: error: stray '\273' in program
a.cpp:1: error: stray '\277' in program

gcc 에서 BOM 이 들어간 소스를 컴파일하는 방법이 없을까요?

eungkyu의 이미지

-finput-charset=CHARSET 이 옵션을 이용하면
UTF-8 이외에 다른 인코딩으로 된 소스를 컴파일할 수 있습니다.

VC++에서 BOM없이 UTF-8 소스를 인식할 수 있는 옵션을 찾아보거나,
아예 위의 옵션을 이용해서 로컬 인코딩 소스를 사용해도 될 거 같습니다.

오호라의 이미지

Quote:
It appears that there's no way to set default file encoding for new files created in Visual Studio 2005 through "Options" and it will save your files in UTF only if it encounters characters it can't save in your systems default non-unicode locale.

What does it mean? It means that if you develop a simple web site in a language of your system (Lithuanian in my case) and you hardcode some local text in your .aspx it will save in non-unicode encoding (Windows-1257 in my case) and when you move it to the server (or other computer) with other default non-unicode encoding all your localized text will be ruined.

What can be done about it? It looks like we have 3 options:

1. manually save or re-save your files using "Save with Encoding";
2. change your system language to "English" in control panel (this is kind of wrong);
3. re-save Visual Studio templates (in Common 7\IDE\ItemTemplates) in UTF-8 with signature

Only the last option somewhat solves the problem but you'll have to go through all of the templates you ever plan to use and hope that this doesn't break anything.

Hopefully this issue will be addressed in VS2008. I had no time to play with the betas yet, so I have no idea if there are any changes in this area. Can anybody confirm this?

> man gcc

Quote:
-fexec-charset=charset
Set the execution character set, used for string and character constants. The default is UTF-8. charset can be any encoding supported by the system’s
"iconv" library routine.

-fwide-exec-charset=charset
Set the wide execution character set, used for wide string and character constants. The default is UTF-32 or UTF-16, whichever corresponds to the
width of "wchar_t". As with -fexec-charset, charset can be any encoding supported by the system’s "iconv" library routine; however, you will have
problems with encodings that do not fit exactly in "wchar_t".

-finput-charset=charset
Set the input character set, used for translation from the character set of the input file to the source character set used by GCC. If the locale does
not specify, or GCC cannot get this information from the locale, the default is UTF-8. This can be overridden by either the locale or this command
line option. Currently the command line option takes precedence if there’s a conflict. charset can be any encoding supported by the system’s "iconv"
library routine.

Quote:
-fshort-wchar
Override the underlying type for wchar_t to be short unsigned int instead of the default for the target. This option is useful for building programs
to run under WINE.

Warning: the -fshort-wchar switch causes GCC to generate code that is not binary compatible with code generated without that switch. Use it to conform
to a non-default application binary interface.

Hello World.

B00m의 이미지

답변 감사합니다.

VC 에서 좀 불편하더라도 수동으로 다시 저장하면 되니까 큰 문제는 안됩니다.

-finput-charset=cp949 로 해서 윈도우 기본 로케일을 사용할려고 하니 gcc 에서 include 하고 있는 헤더 파일들에서 변환이 안된다고 에러 나는 파일들이 있네요.. (boost 파일 쪽..)

결국 VC8 에서 BOM 없는 코드를 컴파일 할 수 있는 방법을 더 찾아 봐야 겠네요..

댓글 달기

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