OSDN Git Service

move functions about manipulating unicode (and surrogate pair) to new class
[sawarabi-fonts/sawarabi-fonts.git] / chartool / objective-c / UnicharUtil.m
1 //
2 //  UnicharUtil.m
3 //  chartool
4 //
5 //  Created by mshio on 11/02/09.
6 //  Copyright 2011 mshio. All rights reserved.
7 //
8
9 #include <stdio.h>
10 #import "UnicharUtil.h"
11
12
13 @implementation UnicharUtil
14
15 + (UnicharUtil*) instance {
16         static UnicharUtil* _instance = nil;
17         
18         if (! _instance) {
19                 _instance = [[UnicharUtil alloc] init];
20         }
21         return _instance;
22 }
23
24 - (NSString*) getUnicharFromCharCode: (NSString*) hexCode {
25         if (hexCode == nil) return @"";
26
27         // convert NSString into char array
28         // for making it a parameter of sscanf.
29         char s[[hexCode length] + 1];
30         for (int i = 0; i < [hexCode length]; i++)
31                 s[i] = (char) [hexCode characterAtIndex: i];
32         s[[hexCode length]] = '\0';
33
34         // convert hex string into int.
35         int v[2] = {0, 0};
36         sscanf(s, "%x", &v[0]);
37
38         int len = 1;
39         if ([hexCode length] == 5) {
40                 int x = v[0] - 0x10000;
41                 v[0] = x / 0x400 + 0xd800;
42                 v[1] = x % 0x400 + 0xdc00;
43                 len = 2;
44         }
45         return [[NSString alloc] initWithCharacters: (unichar[]) {v[0], v[1]} length: len];
46 }
47
48 - (BOOL) characterIsHighSurrogate: (unichar) ch {
49         return 0xd800 <= ch && ch <= 0xdbff;
50 }
51
52 - (BOOL) characterIsLowSurrogate: (unichar) ch {
53         return 0xdc00 <= ch && ch <= 0xdfff;
54 }
55
56 - (BOOL) characterIsHexCharacter: (unichar) ch {
57         return (('0' <= ch && ch <= '9') || ('a' <= ch && ch <= 'f') ||
58                         ('A' <= ch && ch <= 'F'));
59 }
60
61 - (NSString*) getCharCodeFromUnichar: (NSString *) ch {
62         if (ch == nil) return @"";
63
64         NSString* ret;
65         unichar c0 = [ch characterAtIndex: 0];
66         if ([self characterIsHighSurrogate: c0] && [ch length] >= 2) {
67                 unichar c1 = [ch characterAtIndex: 1];
68                 int t = (c0 - 0xd800) * 0x400 + c1 - 0xdc00 + 0x10000;
69                 ret = [NSString stringWithFormat: @"%05x", t];
70         } else {
71                 ret = [NSString stringWithFormat: @"%04x", c0];
72         }
73         return ret;
74 }
75
76 @end