2015-10-29 34 views
17

Từ ?Quotes:Sự khác nhau giữa ký tự mã hex ( x) và unicode ( u) là gì?

\xnn character with given hex code (1 or 2 hex digits) 
\unnnn Unicode character with given code (1--4 hex digits) 

Trong trường hợp các ký tự Unicode chỉ có một hoặc hai chữ số, tôi mong chờ những nhân vật này là giống nhau. Trong thực tế, một trong những ví dụ trên trang ?Quotes giúp đỡ cho thấy:

"\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21" 
## [1] "Hello World!" 
"\u48\u65\u6c\u6c\u6f\u20\u57\u6f\u72\u6c\u64\u21" 
## [1] "Hello World!" 

Tuy nhiên, dưới Linux, khi cố gắng in một dấu hiệu pound, tôi thấy

cat("\ua3") 
## £ 
cat("\xa3") 
## � 

Đó là, mã \x hex không hiển thị chính xác. (Hành vi này vẫn tồn tại với bất kỳ ngôn ngữ nào mà tôi đã thử.) Trong Windows 7, cả hai phiên bản đều hiển thị một dấu thăng.

Nếu tôi chuyển đổi thành số nguyên và ngược lại thì dấu thăng hiển thị chính xác dưới Linux.

cat(intToUtf8(utf8ToInt("\xa3"))) 
## £ 

Ngẫu nhiên, tính năng này không hoạt động trong Windows, kể từ utf8ToInt("\xa3") trả về NA.

Một số \x ký tự trả lại NA trong Windows nhưng lại ném lỗi dưới Linux. Ví dụ:

utf8ToInt("\xf0") 
## Error in utf8ToInt("\xf0") : invalid UTF-8 string 

("\uf0" là một nhân vật có giá trị.)

Những ví dụ này cho thấy có một số khác biệt giữa \x\u hình thức của các nhân vật, mà dường như là hệ điều hành cụ thể, nhưng tôi có thể' t thấy bất kỳ logic trong cách chúng được xác định.

Sự khác nhau giữa hai dạng ký tự này là gì?

+0

Đó là C# nhưng nó có thể giúp bạn vì nó là cùng một câu hỏi: http://stackoverflow.com/questions/32175482/what-is-the-difference-between-using -u-và-x-while-represent-character-lite – etienne

+0

@etienne Tôi sẽ không ngạc nhiên nếu một câu trả lời chi tiết về wiki từ Richie mình sẽ theo sau. –

+1

@DavidArenburg: nah, anh ấy vừa tweet câu hỏi này, vì vậy anh ta phải bị bối rối. :) –

Trả lời

17

Các dãy thoát \xNN chèn byte thô NN vào một chuỗi, trong khi \uNN chèn UTF-8 byte cho điểm mã Unicode NN thành một chuỗi UTF-8:

> charToRaw('\xA3') 
[1] a3 
> charToRaw('\uA3') 
[1] c2 a3 

Hai loại thoát chuỗi không thể được trộn lẫn trong cùng một chuỗi:

> '\ua3\xa3' 
Error: mixing Unicode and octal/hex escapes in a string is not allowed 

này được vì chuỗi thoát cũng xác định mã hóa của chuỗi . Một chuỗi \uNN đặt một cách rõ ràng mã hóa của toàn bộ chuỗi "UTF-8", trong khi \xNN lá nó trong mặc định "không rõ" (. Aka mẹ đẻ) mã hóa:

> Encoding('\xa3') 
[1] "unknown" 
> Encoding('\ua3') 
[1] "UTF-8" 

này trở nên quan trọng khi in các chuỗi, như chúng cần được chuyển đổi thành mã hóa đầu ra thích hợp (ví dụ: bảng điều khiển của bạn).Strings với một mã hóa được xác định có thể được chuyển đổi một cách thích hợp (xem enc2native), nhưng những người có một mã hóa "không rõ" chỉ đơn giản là đầu ra như nó vốn có:

  • Trên Linux, giao diện điều khiển của bạn có lẽ mong đợi UTF-8 văn bản, và như 0xA3 không phải là một chuỗi UTF-8 hợp lệ, nó cung cấp cho bạn " ".
  • Trên Windows, bảng điều khiển của bạn có thể đang chờ văn bản Windows-1252 và dưới dạng 0xA3 là mã hóa chính xác cho "£", đó là những gì bạn thấy. (Khi chuỗi là \uA3, một sự chuyển đổi từ UTF-8 cho Windows-1252 diễn ra.)

Nếu mã hóa được thiết lập một cách rõ ràng, việc chuyển đổi thích hợp sẽ diễn ra trên Linux:

> s <- '\xa3' 
> Encoding(s) <- 'latin1' 
> cat(s) 
£ 
-2

lấy từ Python 2.7 Unicode lÀM THẾ NÀO đỂ Documents:

Trong mã nguồn Python, literals Unicode được viết như chuỗi bắt đầu bằng các 'u' hoặc 'u' nhân vật: u'abcdefghijk'. Mã cụ thể điểm có thể được viết bằng trình tự thoát \ u, được theo sau bằng bốn chữ số thập phân cho điểm mã. Chuỗi thoát \ U là tương tự, nhưng dự kiến ​​8 chữ số thập phân, không phải là 4.

Chữ Unicode cũng có thể sử dụng cùng chuỗi thoát như 8-bit , bao gồm \ x, nhưng \ x chỉ mất hai chữ số hex do đó, không thể thể hiện một điểm mã tùy ý. thoát bát phân có thể đi lên đến U + 01ff, đó là bát phân 777.

một cách đơn giản (Tôi hy vọng):
\ 0nn - xác định một hai chữ số dãy bát phân thoát unicode 'điểm mã'.
\ xnn - chỉ định một mã số hex gồm hai chữ số 'mã'.
\ unnnn - chỉ định bốn mã số hex unicode 'mã điểm'.
\ Unnnnnnnn - chỉ định tám mã byte hex unicode '.

Phải sử dụng đầy đủ số chữ số, được đệm bằng số 0 đứng đầu.

Ví dụ:

>>> ord(u'\010') 
8 
>>> ord(u'\x10') 
16 
>>> ord(u'\020') 
16 
>>> ord(u'\x20') 
32 
>>> ord(u'\u0020') 
32 
>>> ord(u'\U00000020') 
32 
>>> ord(u'\u1000') 
4096 
Các vấn đề liên quan