2011-12-20 21 views
5

Tôi đang làm việc với thư viện C++ và cần tạo một ký tự chưa được ký từ điểm mã UTF-8. Ví dụ, nếu điểm mã là decimal 610 (một 'chữ cái Latinh viết hoa nhỏ G'), làm thế nào tôi có thể tạo điều này trong C++?C++: cách tạo char chưa ký từ điểm mã UTF-8

Tôi javascript, tôi có thể làm như sau:

var temp = String.fromCharCode(610); 
console.log(temp); // Outputs a small 'G' (correct) 
var codePoint = temp.charCodeAt(0); 
console.log(codePoint); // Outputs 610 (correct) 

Trong C++ đã cố gắng:

unsigned char temp = (unsigned char)610; 
// compiles, but 
Debug::WriteLine((int)temp); // outputs 98 (??) 

Vui lòng cung cấp một ví dụ mã trong C++ mà thực hiện giống như ví dụ javascript ở trên.

Môi trường nằm trong C++ được quản lý, nhưng tôi muốn tránh sử dụng các loại CLR khi tôi đang giao tiếp với thư viện của bên thứ ba.

+0

loại của 'Debug' là gì? 'Debug' có nhận ra UTF không? Bởi vì C++ ostreams thì không. Bạn cần một thư viện để làm nhiều việc với UTF, đặc biệt là UTF8. –

+0

'unsigned char' chỉ được đảm bảo giữ giá trị lên đến 255; một codepoint Unicode có thể lớn hơn nhiều. Vấn đề của bạn không được nêu rõ. –

+0

Ah, cuộc sống sẽ dễ dàng hơn nhiều nếu có thể làm được điều này ..... –

Trả lời

5

Một unsigned char là nhỏ để giữ giá trị là 610 (giả sử một char là 8 bit rộng, nó chỉ có thể giữ giá trị 0-255), vì vậy nó sẽ wrap around *

Sử dụng char16_t để lưu trữ 16 -bit char (hoặc char32_t đối với bộ nhớ 32 bit, UTF-8 yêu cầu).

char32_t temp = (char32_t)610; 
Debug::WriteLine(temp); // outputs 610 (!!) 

Nếu bạn muốn xử lý UTF-8 chuỗi, sử dụng UTF-8 chuỗi literals:

u8"I'm a UTF-8 string." 

* Nó sẽ quấn quanh thậm chí gấp đôi trong ví dụ của bạn:

610 - 256 - 256 = 98

+0

Lưu ý rằng 'char16_t' và' char32_t' đang được sử dụng ở đây dưới dạng _codepoints_. –

+0

@MooingDuck, bạn quên đề cập đến rằng 'char16_t' không đủ lớn để giữ mọi điểm và nên tránh cho mục đích đó. Một chuỗi 'char16_t' có thể được sử dụng để giữ UTF-16 theo yêu cầu của Windows. –

3

Điểm mã Unicode có thể cần đại diện 32 bit. Trong hầu hết các ngôn ngữ phương Tây, 16 bit là đủ, nhưng để xử lý tất cả các điểm mã Unicode có thể, bạn thực sự cần 32 bit.

uint32_t codePoint = someString.CodePointAt(x); 

Bạn có thể đọc thêm tại đây: http://en.wikipedia.org/wiki/Code_point.

+0

Unicode sử dụng tối đa 21 bit.Không có kiểu dữ liệu số nào có thể đại diện cho 17-31 bit dữ liệu, vì vậy bạn cần một kiểu số 32 bit chỉ để biểu thị 21 bit dữ liệu. –

0

Nếu bạn có nghĩa là bạn muốn tạo một char trỏ unsigned để đại diện UTF-8 của mã Unicode điểm 610 bạn có thể làm:

char unsigned temp[] = { 0xc9, 0xa2 }; 
Các vấn đề liên quan