2015-07-29 18 views
9

Tôi gặp sự cố Tôi không thể tìm thấy giải pháp. Tôi có một biến chuỗi giữ unicode "1f44d" và tôi muốn chuyển đổi nó thành một ký tự unicode.In ký tự unicode từ biến (nhanh)

Thông thường người ta sẽ làm điều gì đó như thế này:

println("\u{1f44d}") // 

Dưới đây là những gì tôi có nghĩa là:

let charAsString = "1f44d" // code in variable 
println("\u{\(charAsString)}") // not working 

Tôi đã thử nhiều cách khác, nhưng bằng cách nào đó các hoạt động đằng sau kỳ diệu này ở ẩn đối với tôi.

Bạn nên tưởng tượng giá trị của charAsString đến từ cuộc gọi API hoặc từ một đối tượng khác.

Trả lời

8

này có thể được thực hiện theo hai bước sau:

  1. chuyển đổi charAsString-Int đang
  2. đang chuyển đổi sang ký tự unicode

bước thứ hai có thể được thực hiện ví dụ như thế này

var code = 0x1f44d 
var scalar = UnicodeScalar(code) 
var string = "\(scalar)" 

Đối với lần đầu tiên bước, xem here làm thế nào để chuyển đổi String trong đại diện hex để Int

+0

phiên bản ngắn của chuyển đổi một chuỗi hex như "1f44d" đến một Int: 'Int (strtoul (charAsString, nil, 16)) ' – yesman82

9

Một giải pháp khả thi (giải thích "nội tuyến"):

let charAsString = "1f44d" 

// Convert hex string to numeric value first: 
var charCode : UInt32 = 0 
let scanner = NSScanner(string: charAsString) 
if scanner.scanHexInt(&charCode) { 

    // Create string from Unicode code point: 
    let str = String(UnicodeScalar(charCode)) 
    println(str) // 
} else { 
    println("invalid input") 
} 

Hơi đơn giản với Swift 2:

let charAsString = "1f44d" 

// Convert hex string to numeric value first: 
if let charCode = UInt32(charAsString, radix: 16) { 
    // Create string from Unicode code point: 
    let str = String(UnicodeScalar(charCode)) 
    print(str) // 
} else { 
    print("invalid input") 
} 

Cũng lưu ý rằng không phải tất cả các điểm mã là vô hiệu hợp Unicode, so sánh Validate Unicode code point in Swift.


Cập nhật cho Swift 3:

public init?(_ v: UInt32) 

bây giờ là một initializer failable của UnicodeScalar và kiểm tra nếu cho nhập số là một giá trị Unicode vô hướng có giá trị:

let charAsString = "1f44d" 

// Convert hex string to numeric value first: 
if let charCode = UInt32(charAsString, radix: 16), 
    let unicode = UnicodeScalar(charCode) { 
    // Create string from Unicode code point: 
    let str = String(unicode) 
    print(str) // 
} else { 
    print("invalid input") 
} 
+0

Dùng lại một câu trả lời người sử dụng để cải thiện câu trả lời của riêng bạn dường như đối với tôi như một cách khủng khiếp để làm mọi thứ ở đây ... Nhưng tôi có thể sai lầm có lẽ đó là điều bình thường. – Fantattitude

+1

@Fantattitude: Tin tôi hay không, nhưng tôi không thấy câu trả lời của bạn trước khi tôi chỉnh sửa câu trả lời này bằng cách sử dụng mã từ ** câu trả lời trước của tôi ** http://stackoverflow.com/a/27190430/1187415. –

+0

Tôi tin rằng bạn không lo lắng chỉ tìm thấy nó một chút khắc nghiệt. Tôi bắt đầu tham gia sau nhiều năm chỉ đọc để tôi có thể phạm sai lầm. Tuy nhiên bạn có thể cải thiện câu trả lời của bạn bằng cách loại bỏ các cơ số (giá trị mặc định có vẻ hoạt động tốt ở đây). – Fantattitude

3

Kể từ Swift 2.0, mọi loại Int đều có trình khởi tạo có thể lấy String làm một đầu vào. Sau đó bạn có thể dễ dàng tạo ra một UnicodeScalar tương ứng và in nó sau đó. Mà không cần phải thay đổi biểu diễn của bạn của ký tự như chuỗi;).

CẬP NHẬT: Swift 3.0 thay đổi initializer UnicodeScalar

print("\u{1f44d}") // 

let charAsString = "1f44d" // code in variable 

let charAsInt = Int(charAsString, radix: 16)! // As indicated by @MartinR radix is required, default won't do it 
let uScalar = UnicodeScalar(charAsInt)! // In Swift 3.0 this initializer is failible so you'll need either force unwrap or optionnal unwrapping 

print("\(uScalar)") 
+1

Sử dụng Swift 3.0. Câu trả lời của bạn không in kết quả mong muốn trừ khi tôi cũng thêm dấu chấm than để cho uScalar = UnicodeScalar (charAsInt) !, nếu không thì những gì tôi thấy là Tùy chọn ("\ u {0001F44D}"). – svohara

Các vấn đề liên quan