将标点符号从半宽变换为全宽

时间:2017-08-28 03:21:42

标签: ios objective-c unicode

我有一句话如下:

我今天去买菜,买了一个西瓜,花了1.2元,买了一个土豆,花了3.78元。还买了一个无花果,花了45.89,怎么办呢?好贵呀!贵的我不知道再买什么了。

标点符号是半宽,如何更改为全宽,如下所示:

我今天去买菜,买了一个西瓜,花了1.2元,买了一个土豆,花了3.78元。还买了一个无花果,花了45.89,怎么办呢?好贵呀!贵的我不知道再买什么了。

要考虑的一些标点(不详尽):

  • ,to,
  • ?到?
  • !来!
  • ""到“”
  • ;到;

2 个答案:

答案 0 :(得分:2)

您可以使用CFStringTransform,如:

目标C:

NSString *string = @" ? \"\"!我今天去买菜,买了一个西瓜,花了1.2元,买了一个土豆,花了3.78元。还买了一个无花果,花了45.89,怎么办呢?好贵呀!贵的我不知道再买什么了";
    NSMutableString *convertedString = [string mutableCopy];
    CFStringTransform((CFMutableStringRef)convertedString, NULL, kCFStringTransformFullwidthHalfwidth, true);

    NSLog(@"%@",convertedString);

Swift 3.0:

 let string = NSMutableString( string: " ? \"\"!我今天去买菜,买了一个西瓜,花了1.2元,买了一个土豆,花了3.78元。还买了一个无花果,花了45.89,怎么办呢?好贵呀!贵的我不知道再买什么了" )
        CFStringTransform( string, nil, kCFStringTransformFullwidthHalfwidth, true )

        print(string)

答案 1 :(得分:2)

首先,定义要从中转换字符的CharacterSet。因此,如果您只想要标点符号,则该集可以是CharacterSet.punctuationCharactersCharacterSet.alphanumerics.inverted

然后将此集合中的每个字符映射到其HalfwidthFullwidth转换。

Swift 3和4

extension String {
    func transformingHalfwidthFullwidth(from aSet: CharacterSet) -> String {
        return String(characters.map {
            if String($0).rangeOfCharacter(from: aSet) != nil {
                let string = NSMutableString(string: String($0))
                CFStringTransform(string, nil, kCFStringTransformFullwidthHalfwidth, true)
                return String(string).characters.first!
            } else {
                return $0
            }
        })
    }
}

用法

let string = ",?!\"\";abc012図書館 助け 足場が痛い 多くの涙"
let result = string.transformingHalfwidthFullwidth(from: CharacterSet.alphanumerics.inverted)

// it prints: ,?!"";abc012図書館 助け 足場が痛い 多くの涙
print(result)

目标C

@implementation NSString (HalfwidthFullwidth)
- (NSString *)transformingHalfwidthFullwidth:(nonnull NSCharacterSet *)aSet {
    NSUInteger len = self.length;
    unichar buffer[len + 1];
    [self getCharacters:buffer range:NSMakeRange(0, len)];
    for (int i = 0; i < len; i++) {
        unichar c = buffer[i];
        NSMutableString *s = [[NSMutableString alloc] initWithCharacters:&c length:1];
        NSRange r = [s rangeOfCharacterFromSet:aSet];
        if (r.location != NSNotFound) {
            CFStringTransform((CFMutableStringRef)s, nil, kCFStringTransformFullwidthHalfwidth, true);
            [s getCharacters:buffer + i range:NSMakeRange(0, 1)];
        }
    }
    return [NSString stringWithCharacters:buffer length:len];
}
@end

用法

NSString *string = @",?!\"\";abc012図書館 助け 足場が痛い 多くの涙";
NSString *result = [string transformingHalfwidthFullwidth:NSCharacterSet.alphanumericCharacterSet.invertedSet];

// it prints: ,?!"";abc012図書館 助け 足場が痛い 多くの涙
NSLog(result);