54 lines
1.5 KiB
JavaScript
54 lines
1.5 KiB
JavaScript
const Mode = require('./mode')
|
|
const Utils = require('./utils')
|
|
|
|
function KanjiData (data) {
|
|
this.mode = Mode.KANJI
|
|
this.data = data
|
|
}
|
|
|
|
KanjiData.getBitsLength = function getBitsLength (length) {
|
|
return length * 13
|
|
}
|
|
|
|
KanjiData.prototype.getLength = function getLength () {
|
|
return this.data.length
|
|
}
|
|
|
|
KanjiData.prototype.getBitsLength = function getBitsLength () {
|
|
return KanjiData.getBitsLength(this.data.length)
|
|
}
|
|
|
|
KanjiData.prototype.write = function (bitBuffer) {
|
|
let i
|
|
|
|
// In the Shift JIS system, Kanji characters are represented by a two byte combination.
|
|
// These byte values are shifted from the JIS X 0208 values.
|
|
// JIS X 0208 gives details of the shift coded representation.
|
|
for (i = 0; i < this.data.length; i++) {
|
|
let value = Utils.toSJIS(this.data[i])
|
|
|
|
// For characters with Shift JIS values from 0x8140 to 0x9FFC:
|
|
if (value >= 0x8140 && value <= 0x9FFC) {
|
|
// Subtract 0x8140 from Shift JIS value
|
|
value -= 0x8140
|
|
|
|
// For characters with Shift JIS values from 0xE040 to 0xEBBF
|
|
} else if (value >= 0xE040 && value <= 0xEBBF) {
|
|
// Subtract 0xC140 from Shift JIS value
|
|
value -= 0xC140
|
|
} else {
|
|
throw new Error(
|
|
'Invalid SJIS character: ' + this.data[i] + '\n' +
|
|
'Make sure your charset is UTF-8')
|
|
}
|
|
|
|
// Multiply most significant byte of result by 0xC0
|
|
// and add least significant byte to product
|
|
value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff)
|
|
|
|
// Convert result to a 13-bit binary string
|
|
bitBuffer.put(value, 13)
|
|
}
|
|
}
|
|
|
|
module.exports = KanjiData
|