2011-10-26 38 views
11

Tôi phát triển nền tảng chéo C++ sử dụng Microsoft Visual Studio trên Windows và GCC trên uBuntu Linux.Có thể nhận GCC để biên dịch UTF-8 với các tệp nguồn BOM không?

Trong Visual Studio tôi có thể sử dụng biểu tượng unicode như "π" và "²" trong mã của tôi. Visual Studio luôn lưu các tệp nguồn dưới dạng UTF-8 với BOM (Dấu thứ tự byte).

Ví dụ:

// A = π.r² 
double π = 3.14; 

GCC hạnh phúc biên dịch những tập tin này chỉ khi tôi tháo BOM đầu tiên. Nếu tôi không loại bỏ các BOM, tôi nhận được lỗi như thế này:

wwga_hydutils.cpp:28:9: error: stray ‘\317’ in program

wwga_hydutils.cpp:28:9: error: stray ‘\200’ in program

đó mang lại cho tôi câu hỏi:

Có cách nào để có được GCC để biên dịch file UTF-8 mà không cần loại bỏ các BOM ?


Tôi đang sử dụng:

  • Windows 7
  • Visual Studio 2010

và:

  • Ubuntu Oneiric 11.10
  • GCC 4.6.1 (theo quy định của apt-get install gcc)

Chỉnh sửa:

Khi commenter đầu tiên chỉ ra, vấn đề của tôi là không HĐQT, nhưng có các ký tự không phải ascii nằm ngoài chuỗi hằng số. GCC không thích các ký tự không phải ascii trong các tên biểu tượng, nhưng hóa ra GCC hoàn toàn tương thích với UTF-8 với BOM.

+2

Làm việc tốt cho tôi trong gcc 4.4.5, sử dụng chuỗi chứa cả hai ký tự UNICODE trong câu hỏi của bạn. Tập tin với BOM. Ngoài ra, lỗi bạn nhận được không liên quan gì đến BOM, nhưng dường như các ký tự UNICODE được đề cập nằm ngoài bất kỳ chuỗi nào (đó là lý do tại sao chúng được gọi là _stray_.) –

+0

@JoachimPileborg có các ký tự unicode nằm ngoài chuỗi, "π" tôi đã sử dụng làm tên biểu tượng, "²" chỉ ở trong nhận xét. Khi tôi loại bỏ các BOM, nó loại bỏ lỗi từ đầu ra giao diện điều khiển, nhưng tôi đoán đó là không có gaurantee rằng GCC thực sự xử lý các ký tự như thế nào tôi mong đợi. – Boinst

+0

@JoachimPileborg, tôi đã cập nhật câu hỏi để bao gồm ngữ cảnh trong đó tôi đang sử dụng các ký tự unicode. – Boinst

Trả lời

2

Theo số GCC Wiki, tính năng này chưa được hỗ trợ. Bạn có thể sử dụng -fextended-identifiers và xử lý trước mã của mình để chuyển đổi số nhận dạng thành UCN. Từ trang liên quan:

perl -pe 'BEGIN { binmode STDIN, ":utf8"; } s/(.)/ord($1) < 128 ? $1 : sprintf("\\U%08x", ord($1))/ge;' 

Xem thêm và g++ unicode variable nameUnicode Identifiers and Source Code in C++11?

3

Trong khi định danh unicode được hỗ trợ trong gcc, UTF-8 đầu vào thì không. Do đó, mã định danh unicode phải được mã hóa bằng cách sử dụng mã thoát \ uXXXX và \ UXXXXXXXX. Tuy nhiên, một bản vá một dòng đơn giản cho bộ tiền xử lý cpp cho phép gcc và g ++ xử lý đầu vào UTF-8 cung cấp một phiên bản mới nhất của biểu tượng hỗ trợ chuyển đổi C99 cũng được cài đặt. Thông tin chi tiết có mặt tại

https://www.raspberrypi.org/forums/viewtopic.php?p=802657

Tuy nhiên, bản vá là đơn giản như vậy nó có thể được đưa ra ngay tại đây.

diff -cNr gcc-5.2.0/libcpp/charset.c gcc-5.2.0-ejo/libcpp/charset.c 
*** gcc-5.2.0/libcpp/charset.c Mon Jan 5 04:33:28 2015 
--- gcc-5.2.0-ejo/libcpp/charset.c Wed Aug 12 14:34:23 2015 
*************** 
*** 1711,1717 **** 
    struct _cpp_strbuf to; 
    unsigned char *buffer; 

! input_cset = init_iconv_desc (pfile, SOURCE_CHARSET, input_charset); 
    if (input_cset.func == convert_no_conversion) 
     { 
     to.text = input; 
--- 1711,1717 ---- 
    struct _cpp_strbuf to; 
    unsigned char *buffer; 

! input_cset = init_iconv_desc (pfile, "C99", input_charset); 
    if (input_cset.func == convert_no_conversion) 
     { 
     to.text = input; 

Ngay cả với bản vá, hai tùy chọn dòng lệnh là cần thiết để bật đầu vào UTF-8. Cụ thể, hãy thử một cái gì đó như

$ /usr/local/gcc-5.2/bin/gcc \ 
    -finput-charset=UTF-8 -fextended-identifiers \ 
    -o circle circle.c 
Các vấn đề liên quan