Archive: 2023年1月20日

iOS开发 之 简体和繁体中文转换

最近做项目,需要用到简体和繁体中文转换,因此封装了一个中文转换的类贡献给大家。

大概思路是这样的:

1、先加载简体中文和繁体中文码表

2、将需要转换的中文字符拿到码表上查找相应位置

3、如果查找到了,则取出另一个码表上对应的字符;如果没查到,则不进行转换。

一、详细代码

//
//  ZMChineseConvert.m
//  ZMChineseConvert
//
//  Created by ZengZhiming on 2017/3/30.
//  Copyright © 2017年 菜鸟基地. All rights reserved.
//
 
#import "ZMChineseConvert.h"
 
@interface ZMChineseConvert ()
 
@property(nonatomic, strong) NSString *simplifiedCode;  //!< 简体中文码表.
@property(nonatomic, strong) NSString *traditionalCode; //!< 繁体中文码表.
 
@end
 
@implementation ZMChineseConvert
 
 
/**
 简体中文转繁体中文
 
 @param simpString 简体中文字符串
 @return 繁体中文字符串
 */
+ (NSString *)convertSimplifiedToTraditional:(NSString *)simpString
{
    return [[ZMChineseConvert getInstance] convertSimplifiedToTraditional:simpString];
}
 
 
/**
 繁体中文转简体中文
 
 @param tradString 繁体中文字符串
 @return 简体中文字符串
 */
+ (NSString*)convertTraditionalToSimplified:(NSString*)tradString
{
    return [[ZMChineseConvert getInstance] convertTraditionalToSimplified:tradString];
}
 
 
// 获取单例对象
+ (instancetype)getInstance
{
    static id instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
}
 
- (instancetype)init
{
    self = [super init];
    if (self) {
        // 加载简体中文和繁体中文码表
        NSString *resourcePath = [ [NSBundle mainBundle] resourcePath];
        self.simplifiedCode = [NSString stringWithContentsOfFile:[resourcePath stringByAppendingPathComponent:@"SimplifiedCode.txt"] encoding:NSUTF8StringEncoding error:nil];
        self.traditionalCode = [NSString stringWithContentsOfFile:[resourcePath stringByAppendingPathComponent:@"TraditionalCode.txt"] encoding:NSUTF8StringEncoding error:nil];
    }
    return self;
}
 
 
/**
 简体中文转繁体中文
 
 @param simpString 简体中文字符串
 @return 繁体中文字符串
 */
- (NSString *)convertSimplifiedToTraditional:(NSString *)simpString
{
    // 空值判断
    if (IsNullString(simpString)) {
        return nil;
    }
    
    // 存储转换结果
    NSMutableString *resultString = [NSMutableString string];
    
    // 遍历字符串中的字符
    NSInteger length = [simpString length];
    for (NSInteger i = 0; i < length; i++)
    {
        // 在简体中文中查找字符位置,如果存在则取出对应的繁体中文
        NSString *simCharString = [simpString substringWithRange:NSMakeRange(i, 1)];
        NSRange charRange = [self.simplifiedCode rangeOfString:simCharString];
        if(charRange.location != NSNotFound) {
            NSString *tradCharString = [self.traditionalCode substringWithRange:charRange];
            [resultString appendString:tradCharString];
        }else{
            [resultString appendString:simCharString];
        }
    }
    return resultString;
}
 
 
/**
 繁体中文转简体中文
 
 @param tradString 繁体中文字符串
 @return 简体中文字符串
 */
- (NSString *)convertTraditionalToSimplified:(NSString *)tradString
{
    // 空值判断
    if (IsNullString(tradString)) {
        return nil;
    }
    
    // 存储转换结果
    NSMutableString *resultString = [NSMutableString string];
    
    // 遍历字符串中的字符
    NSInteger length = [tradString length];
    for (NSInteger i = 0; i < length; i++)
    {
        // 在繁体中文中查找字符位置,如果存在则取出对应的简体中文
        NSString *tradCharString = [tradString substringWithRange:NSMakeRange(i, 1)];
        NSRange charRange = [self.traditionalCode rangeOfString:tradCharString];
        if(charRange.location != NSNotFound) {
            NSString *simCharString = [self.simplifiedCode substringWithRange:charRange];
            [resultString appendString:simCharString];
        }else{
            [resultString appendString:tradCharString];
        }
    }
    return resultString;
}
 
@end

二、使用方式

/** 简转繁点击响应 */
- (IBAction)onSimpToTradAction:(UIButton *)sender {
    _resultLabel.text = [ZMChineseConvert convertSimplifiedToTraditional:_textField.text];
}
 
/** 繁转简点击响应 */
- (IBAction)onTradToSimpAction:(UIButton *)sender {
    _resultLabel.text = [ZMChineseConvert convertTraditionalToSimplified:_textField.text];
}

Demo请移步:https://github.com/zeng-zhiming/ZMChineseConvert

iOS开发 之 中文转拼音

在项目中显示通讯录往往需要把中文名字转换为拼音来进行排序,为此我封装了一个类,将中文转为拼音分享给大家。

思路主要为:

1、使用[CFStringTransform]的[kCFStringTransformMandarinLatin]可以将中文转为带音调的拼音

2、使用[CFStringTransform]的[kCFStringTransformStripDiacritics]可以去掉音调符号

3、遍历字符串,将每个字符转为拼音后可以只取拼音首字母来进行使用

一、详细代码

//
//  NSString+PinYin.m
//  ZMPinYinDemo
//
//  Created by ZengZhiming on 2017/3/31.
//  Copyright © 2017年 菜鸟基地. All rights reserved.
//
 
#import "NSString+PinYin.h"
 
@implementation NSString (PinYin)
 
 
/**
 将中文字符串转换为拼音格式(带声调)
 @return 返回带声调拼音字符串
 */
- (NSString *)transformToPinyinTone
{
    // 空值判断
    if (IsNullString(self)) {
        return @"";
    }
    // 将字符串转为NSMutableString类型
    NSMutableString *string = [self mutableCopy];
    // 将字符串转换为拼音音调格式
    CFStringTransform((__bridge CFMutableStringRef)string, NULL, kCFStringTransformMandarinLatin, NO);
    // 返回带声调拼音字符串
    return string;
}
 
 
/**
 将中文字符串转换为拼音格式(不带声调)
 @return 返回不带声调拼音字符串
 */
- (NSString *)transformToPinyin
{
    // 空值判断
    if (IsNullString(self)) {
        return @"";
    }
    // 将字符串转为NSMutableString类型
    NSMutableString *string = [self mutableCopy];
    // 将字符串转换为拼音音调格式
    CFStringTransform((__bridge CFMutableStringRef)string, NULL, kCFStringTransformMandarinLatin, NO);
    // 去掉音调符号
    CFStringTransform((__bridge CFMutableStringRef)string, NULL, kCFStringTransformStripDiacritics, NO);
    // 返回不带声调拼音字符串
    return string;
}
 
 
/**
 将中字符串转换为拼音首字母
 @return 拼音首字母字符串
 */
- (NSString *)transformToFirstLetter
{
    // 空值判断
    if (IsNullString(self)) {
        return @"";
    }
    // 首字母存储
    NSMutableString *firstLetterStirng = [NSMutableString string];
    // 遍历字符串中的所有字符
    for (NSUInteger i = 0; i < self.length; i++) {
        // 将每个字符截取后进行拼音转换
        NSString *charStr = [self substringWithRange:NSMakeRange(i, 1)];
        NSString *pinyin = [charStr transformToPinyin];
        // 存储转换后的拼音首字母
        [firstLetterStirng appendString:[pinyin substringToIndex:1]];
    }
    // 返回中文首字母字符串
    return [firstLetterStirng uppercaseString];
}
 
@end

二、使用方式

/** 拼音转换按钮点击 */
- (IBAction)onPinYinAction:(UIButton *)sender {
    
    // 显示带声调的拼音
    _pinyinToneLabel.text = [_textField.text transformToPinyinTone];
    // 显示不带声调的拼音
    _pinyinLabel.text = [_textField.text transformToPinyin];
    // 显示拼音首字母
    _firstLetterlLabel.text = [_textField.text transformToFirstLetter];
    
}

Demo请移步:https://github.com/zeng-zhiming/ZMPinYinDemo