📄 sjis.c
字号:
/* * @(#)sjis.c 1.15 02/07/24 @(#) * * Copyright (c) 1999-2002 Sun Microsystems, Inc. All rights reserved. * PROPRIETARY/CONFIDENTIAL * Use is subject to license terms. */#include <kni.h>#include "conv.h"static int byteToCharSJIS_convert(const unsigned char *in, int inStart, int inEnd, unsigned short *out, int outStart, int outEnd, int *charOff, unsigned char *savedByte, int *badChars);static int charToByteSJIS_convert(const unsigned short *in, int inStart, int inEnd, unsigned char *out, int outStart, int outEnd, int *byteOff, int *badChars);static intSJISMaxLen(void){ return 2;}static intSJISLen(const unsigned char *c, int len){ if (c == NULL || *c == '\0') { return 0; } if ((*c > 0x80 && *c < 0xA0) || *c > 0xDF) { return (len >= 2) ? 2 : -1; } return (len >= 1) ? 1 : -1;}static intunicodeToSJIS(const unicode *ustr, int ulen, unsigned char *sstr, int slen){ int byteOff = 0; /* when ulen == 0, charToByteSJIS_convert dose not work correctly. */ if (ulen > 0) { int badChars; charToByteSJIS_convert(ustr, 0, ulen, sstr, 0, slen, &byteOff, &badChars); } return byteOff;}static intSJISToUnicode(const unsigned char *sstr, int slen, unicode *ustr, int ulen){ int charOff = 0; /* when slen == 0, byteToCharSJIS_convert dose not work correctly. */ if (slen > 0) { int badChars; unsigned char savedByte = 0; byteToCharSJIS_convert(sstr, 0, slen, ustr, 0, ulen, &charOff, &savedByte, &badChars); } return charOff;}static intsizeOfSJISInUnicode(const unsigned char *b, int offset, int len){ int numChars = 0; if (len > 0) { int pos = offset; int end = offset + len; char bPos = 1; for (; pos < end; pos++) { unsigned char t = (unsigned char) b[pos]; if (bPos == 2) { bPos = 1; } else if ((t > 0x80 && t < 0xA0) || t > 0xDF) { bPos = 2; continue; } numChars++; } } return numChars;}static intsizeOfUnicodeInSJIS(const unicode *c, int offset, int len){ int numBytes = 0; if (len > 0) { int pos = offset; int end = offset + len; for (; pos < end; pos++) { unicode u = (unicode) c[pos]; if (u < 0x81 || (u > 0xFF60 && u < 0xFF9F) || u == 0xA0 || u == 0xA5 || u == 0x203E) { numBytes++; } else { numBytes += 2; } } } return numBytes;} LcConvMethodsRec SJISConvRec = { "SJIS", SJISMaxLen, SJISLen, unicodeToSJIS, SJISToUnicode, sizeOfSJISInUnicode, sizeOfUnicodeInSJIS};/*========================================================================= * SYSTEM: KVM * SUBSYSTEM: Internationalization - Japanese encoding translation * FILE: uni2sjis.h * OVERVIEW: Definitions for Unicode to Shift-JIS encoding conversion * AUTHOR: Jim Clark, nightware@mindspring.com *=======================================================================*/#define uni2sjis_h#define KANJI_START_VAL 0x4E00 /* First Unicode value in kanji table. *//* Set index frequency. This controls which index into the kanji * conversion table will be compiled into uni2sjisData.c * * Define ONE of the following: * * KANJI_INDEX_FREQ_008 * KANJI_INDEX_FREQ_016 * KANJI_INDEX_FREQ_032 * KANJI_INDEX_FREQ_064 * KANJI_INDEX_FREQ_128 * KANJI_INDEX_FREQ_256 * */#define KANJI_INDEX_FREQ_256#ifdef KANJI_INDEX_FREQ_008#define KANJI_INDEX_FREQ 8#endif#ifdef KANJI_INDEX_FREQ_016#define KANJI_INDEX_FREQ 16#endif#ifdef KANJI_INDEX_FREQ_032#define KANJI_INDEX_FREQ 32#endif#ifdef KANJI_INDEX_FREQ_064#define KANJI_INDEX_FREQ 64#endif#ifdef KANJI_INDEX_FREQ_128#define KANJI_INDEX_FREQ 128#endif#ifdef KANJI_INDEX_FREQ_256#define KANJI_INDEX_FREQ 256#endif/* Kanji table index item definition. */typedef struct { unsigned short offset; unsigned char hitBitmap [KANJI_INDEX_FREQ / 8];} kanjiIndexItem;/*========================================================================= * SYSTEM: KVM * SUBSYSTEM: Internationalization - Japanese encoding translation * FILE: sjis2uniData.c * OVERVIEW: Data tables for Shift-JIS to Unicode encoding conversion * AUTHOR: Jim Clark, nightware@mindspring.com *=======================================================================*/static const unsigned short sjis2uni_0x8140 [4] [189] = { { 0x3000, /* 0x8140 # IDEOGRAPHIC SPACE */ 0x3001, /* 0x8141 # IDEOGRAPHIC COMMA */ 0x3002, /* 0x8142 # IDEOGRAPHIC FULL STOP */ 0xFF0C, /* 0x8143 # FULLWIDTH COMMA */ 0xFF0E, /* 0x8144 # FULLWIDTH FULL STOP */ 0x30FB, /* 0x8145 # KATAKANA MIDDLE DOT */ 0xFF1A, /* 0x8146 # FULLWIDTH COLON */ 0xFF1B, /* 0x8147 # FULLWIDTH SEMICOLON */ 0xFF1F, /* 0x8148 # FULLWIDTH QUESTION MARK */ 0xFF01, /* 0x8149 # FULLWIDTH EXCLAMATION MARK */ 0x309B, /* 0x814A # KATAKANA-HIRAGANA VOICED SOUND MARK */ 0x309C, /* 0x814B # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ 0x00B4, /* 0x814C # ACUTE ACCENT */ 0xFF40, /* 0x814D # FULLWIDTH GRAVE ACCENT */ 0x00A8, /* 0x814E # DIAERESIS */ 0xFF3E, /* 0x814F # FULLWIDTH CIRCUMFLEX ACCENT */ 0xFFE3, /* 0x8150 # FULLWIDTH MACRON */ 0xFF3F, /* 0x8151 # FULLWIDTH LOW LINE */ 0x30FD, /* 0x8152 # KATAKANA ITERATION MARK */ 0x30FE, /* 0x8153 # KATAKANA VOICED ITERATION MARK */ 0x309D, /* 0x8154 # HIRAGANA ITERATION MARK */ 0x309E, /* 0x8155 # HIRAGANA VOICED ITERATION MARK */ 0x3003, /* 0x8156 # DITTO MARK */ 0x4EDD, /* 0x8157 # <CJK> */ 0x3005, /* 0x8158 # IDEOGRAPHIC ITERATION MARK */ 0x3006, /* 0x8159 # IDEOGRAPHIC CLOSING MARK */ 0x3007, /* 0x815A # IDEOGRAPHIC NUMBER ZERO */ 0x30FC, /* 0x815B # KATAKANA-HIRAGANA PROLONGED SOUND MARK */ 0x2015, /* 0x815C # HORIZONTAL BAR */ 0x2010, /* 0x815D # HYPHEN */ 0xFF0F, /* 0x815E # FULLWIDTH SOLIDUS */ 0xFF3C, /* 0x815F # REVERSE SOLIDUS */ 0x301C, /* 0x8160 # WAVE DASH */ 0x2016, /* 0x8161 # DOUBLE VERTICAL LINE */ 0xFF5C, /* 0x8162 # FULLWIDTH VERTICAL LINE */ 0x2026, /* 0x8163 # HORIZONTAL ELLIPSIS */ 0x2025, /* 0x8164 # TWO DOT LEADER */ 0x2018, /* 0x8165 # LEFT SINGLE QUOTATION MARK */ 0x2019, /* 0x8166 # RIGHT SINGLE QUOTATION MARK */ 0x201C, /* 0x8167 # LEFT DOUBLE QUOTATION MARK */ 0x201D, /* 0x8168 # RIGHT DOUBLE QUOTATION MARK */ 0xFF08, /* 0x8169 # FULLWIDTH LEFT PARENTHESIS */ 0xFF09, /* 0x816A # FULLWIDTH RIGHT PARENTHESIS */ 0x3014, /* 0x816B # LEFT TORTOISE SHELL BRACKET */ 0x3015, /* 0x816C # RIGHT TORTOISE SHELL BRACKET */ 0xFF3B, /* 0x816D # FULLWIDTH LEFT SQUARE BRACKET */ 0xFF3D, /* 0x816E # FULLWIDTH RIGHT SQUARE BRACKET */ 0xFF5B, /* 0x816F # FULLWIDTH LEFT CURLY BRACKET */ 0xFF5D, /* 0x8170 # FULLWIDTH RIGHT CURLY BRACKET */ 0x3008, /* 0x8171 # LEFT ANGLE BRACKET */ 0x3009, /* 0x8172 # RIGHT ANGLE BRACKET */ 0x300A, /* 0x8173 # LEFT DOUBLE ANGLE BRACKET */ 0x300B, /* 0x8174 # RIGHT DOUBLE ANGLE BRACKET */ 0x300C, /* 0x8175 # LEFT CORNER BRACKET */ 0x300D, /* 0x8176 # RIGHT CORNER BRACKET */ 0x300E, /* 0x8177 # LEFT WHITE CORNER BRACKET */ 0x300F, /* 0x8178 # RIGHT WHITE CORNER BRACKET */ 0x3010, /* 0x8179 # LEFT BLACK LENTICULAR BRACKET */ 0x3011, /* 0x817A # RIGHT BLACK LENTICULAR BRACKET */ 0xFF0B, /* 0x817B # FULLWIDTH PLUS SIGN */ 0x2212, /* 0x817C # MINUS SIGN */ 0x00B1, /* 0x817D # PLUS-MINUS SIGN */ 0x00D7, /* 0x817E # MULTIPLICATION SIGN */ 0xFFFD, /* 0x817f # NO MAPPING */ 0x00F7, /* 0x8180 # DIVISION SIGN */ 0xFF1D, /* 0x8181 # FULLWIDTH EQUALS SIGN */ 0x2260, /* 0x8182 # NOT EQUAL TO */ 0xFF1C, /* 0x8183 # FULLWIDTH LESS-THAN SIGN */ 0xFF1E, /* 0x8184 # FULLWIDTH GREATER-THAN SIGN */ 0x2266, /* 0x8185 # LESS-THAN OVER EQUAL TO */ 0x2267, /* 0x8186 # GREATER-THAN OVER EQUAL TO */ 0x221E, /* 0x8187 # INFINITY */ 0x2234, /* 0x8188 # THEREFORE */ 0x2642, /* 0x8189 # MALE SIGN */ 0x2640, /* 0x818A # FEMALE SIGN */ 0x00B0, /* 0x818B # DEGREE SIGN */ 0x2032, /* 0x818C # PRIME */ 0x2033, /* 0x818D # DOUBLE PRIME */ 0x2103, /* 0x818E # DEGREE CELSIUS */ 0xFFE5, /* 0x818F # FULLWIDTH YEN SIGN */ 0xFF04, /* 0x8190 # FULLWIDTH DOLLAR SIGN */ 0x00A2, /* 0x8191 # CENT SIGN */ 0x00A3, /* 0x8192 # POUND SIGN */ 0xFF05, /* 0x8193 # FULLWIDTH PERCENT SIGN */ 0xFF03, /* 0x8194 # FULLWIDTH NUMBER SIGN */ 0xFF06, /* 0x8195 # FULLWIDTH AMPERSAND */ 0xFF0A, /* 0x8196 # FULLWIDTH ASTERISK */ 0xFF20, /* 0x8197 # FULLWIDTH COMMERCIAL AT */ 0x00A7, /* 0x8198 # SECTION SIGN */ 0x2606, /* 0x8199 # WHITE STAR */ 0x2605, /* 0x819A # BLACK STAR */ 0x25CB, /* 0x819B # WHITE CIRCLE */ 0x25CF, /* 0x819C # BLACK CIRCLE */ 0x25CE, /* 0x819D # BULLSEYE */ 0x25C7, /* 0x819E # WHITE DIAMOND */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -