36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
/**
|
|
* Decode a DXF buffer to text.
|
|
*
|
|
* Modern CAD exports are UTF-8 but often keep a legacy $DWGCODEPAGE
|
|
* (e.g. ANSI_949) that no longer matches the bytes — so the header is
|
|
* unreliable. Strategy: try UTF-8 strictly (self-validating); on failure
|
|
* fall back to the header's single-byte codepage. The DXF group/value
|
|
* structure is ASCII regardless, so this only affects TEXT/MTEXT strings.
|
|
*/
|
|
export function decodeDxf(buf: ArrayBuffer): string {
|
|
try {
|
|
return new TextDecoder('utf-8', { fatal: true }).decode(buf);
|
|
} catch {
|
|
/* not valid UTF-8 → legacy single-byte codepage */
|
|
}
|
|
const head = new TextDecoder('latin1').decode(
|
|
new Uint8Array(buf, 0, Math.min(buf.byteLength, 4096)),
|
|
);
|
|
const cp = head
|
|
.match(/\$DWGCODEPAGE[\s\S]*?\n\s*3\s*\n\s*([^\r\n]+)/i)?.[1]
|
|
?.trim()
|
|
.toLowerCase();
|
|
let label = 'windows-1252';
|
|
if (cp) {
|
|
if (/949/.test(cp)) label = 'euc-kr';
|
|
else if (/932/.test(cp)) label = 'shift_jis';
|
|
else if (/936/.test(cp)) label = 'gbk';
|
|
else if (/950/.test(cp)) label = 'big5';
|
|
}
|
|
try {
|
|
return new TextDecoder(label).decode(buf);
|
|
} catch {
|
|
return new TextDecoder('utf-8').decode(buf);
|
|
}
|
|
}
|