2016-12-21 7 views
0

У меня есть строка, которая может содержать символы Юникода в форме «\ u {0026}», и я хочу, чтобы она была преобразована в соответствующий символ «&».Как преобразовать строку « u {0026}» в «&» в Swift?

Как это сделать?

let input = "\\u{0026} something else here" 
let expectedOutput = "& something else here" 

Большое спасибо!

+2

'' \ u {0026} что-то еще здесь «logs» и что-то еще здесь ». В чем проблема? –

+0

Сделано редактирование, чтобы добавить дополнительную обратную косую черту. Спасибо за указание – Junz

+1

Откуда взялась строка? * Почему * он закодирован так? –

ответ

0

Вам может потребоваться использовать регулярные выражения:

class StringEscpingRegex: NSRegularExpression { 
    override func replacementString(for result: NSTextCheckingResult, in string: String, offset: Int, template templ: String) -> String { 
     let nsString = string as NSString 
     if 
      result.numberOfRanges == 2, 
      case let capturedString = nsString.substring(with: result.rangeAt(1)), 
      let codePoint = UInt32(capturedString, radix: 16), 
      codePoint != 0xFFFE, codePoint != 0xFFFF, codePoint <= 0x10FFFF, 
      codePoint<0xD800 || codePoint > 0xDFFF 
     { 
      return String(Character(UnicodeScalar(codePoint)!)) 
     } else { 
      return super.replacementString(for: result, in: string, offset: offset, template: templ) 
     } 
    } 
} 

let pattern = "\\\\u\\{([0-9A-Fa-f]{1,6})\\}" 
let regex = try! StringEscpingRegex(pattern: pattern) 

let input = "\\u{0026} something else here" 
let expectedOutput = "& something else here" 

let actualOutput = regex.stringByReplacingMatches(in: input, range: NSRange(0..<input.utf16.count), withTemplate: "?") 

assert(actualOutput == expectedOutput) //assertion succeeds 

Я не понимаю, как вы получили ваш input. Но если вы приняли стандартное представление, вы можете просто получить expectedOutput.

+0

большое спасибо! Это сработало – Junz

+0

@WongJunMing, я мало знаю о результате API, с которым вы ссылаетесь, но, по крайней мере, если вы не вставляете в него фигурные скобки, код может быть проще. И помните, код, показанный в моем ответе, не работает, если в результате API использует экранированные суррогатные пары для представления символов, отличных от BMP. Лучше начать новый поток, спрашивая, как декодировать исходный ответ (перед вставкой фигурных скобок), вы найдете много более простых ответов. – OOPer

0

На самом деле, я не знаком с тем, что @MartinR предложил в своем комментарии (ы), это может быть решение для вашей проблемы ...

Однако, вы можете просто добиться того, что вы пытаетесь сделать с помощью метода replacingOccurrences(of:with:) строки:

Возвращает новую строку, в которой все вхождения искомой строки в приемнике заменены на другой заданную строку.

Таким образом, применительно к вашей строке:

let input = "\\u{0026} something else here" 

let output1 = input.replacingOccurrences(of: "\\u{0026}", with: "\u{0026}") // "& something else here" 

// OR... 

let output2 = input.replacingOccurrences(of: "\\u{0026}", with: "&") // "& something else here" 

Надеется, что это помогло.