Skip to content

Commit a15ec2d

Browse files
authored
feat: add option to auto detect encoding (#1547)
1 parent 604bcac commit a15ec2d

File tree

3 files changed

+33
-14
lines changed

3 files changed

+33
-14
lines changed

src/lib/openFile.js

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -386,14 +386,21 @@ export default async function openFile(file, options = {}) {
386386

387387
const binData = await fs.readFile();
388388

389-
// Detect encoding if not explicitly provided
389+
// Determine encoding: if explicit provided use it, otherwise
390+
// if settings.defaultFileEncoding === 'auto' then detect; else use the default as-is
390391
let detectedEncoding = file.encoding || encoding;
391392
if (!detectedEncoding) {
392-
try {
393-
detectedEncoding = await detectEncoding(binData);
394-
} catch (error) {
395-
console.warn("Encoding detection failed, using default:", error);
396-
detectedEncoding = appSettings.value.defaultFileEncoding;
393+
const defaultSetting = appSettings.value.defaultFileEncoding;
394+
if (defaultSetting === "auto") {
395+
try {
396+
detectedEncoding = await detectEncoding(binData);
397+
if (detectedEncoding === "auto") detectedEncoding = "UTF-8";
398+
} catch (error) {
399+
console.warn("Encoding detection failed, using UTF-8:", error);
400+
detectedEncoding = "UTF-8";
401+
}
402+
} else {
403+
detectedEncoding = defaultSetting || "UTF-8";
397404
}
398405
}
399406

src/settings/appSettings.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,15 @@ export default function otherSettings() {
178178
key: "defaultFileEncoding",
179179
text: strings["default file encoding"],
180180
value: values.defaultFileEncoding,
181-
valueText: (value) => getEncoding(value).label,
182-
select: Object.keys(encodings).map((id) => {
183-
const encoding = encodings[id];
184-
return [id, encoding.label];
185-
}),
181+
valueText: (value) =>
182+
value === "auto" ? strings.auto || "Auto" : getEncoding(value).label,
183+
select: [
184+
["auto", strings.auto || "Auto"],
185+
...Object.keys(encodings).map((id) => {
186+
const encoding = encodings[id];
187+
return [id, encoding.label];
188+
}),
189+
],
186190
},
187191
];
188192

src/utils/encodings.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ function isValidUTF8(bytes) {
9191

9292
export async function detectEncoding(buffer) {
9393
if (!buffer || buffer.byteLength === 0) {
94-
return settings.value.defaultFileEncoding || "UTF-8";
94+
const def = settings.value.defaultFileEncoding;
95+
return def === "auto" ? "UTF-8" : def || "UTF-8";
9596
}
9697

9798
const bytes = new Uint8Array(buffer);
@@ -115,7 +116,9 @@ export async function detectEncoding(buffer) {
115116
const encodings = [
116117
...new Set([
117118
"UTF-8",
118-
settings.value.defaultFileEncoding || "UTF-8",
119+
settings.value.defaultFileEncoding === "auto"
120+
? "UTF-8"
121+
: settings.value.defaultFileEncoding || "UTF-8",
119122
"windows-1252",
120123
"ISO-8859-1",
121124
]),
@@ -144,7 +147,8 @@ export async function detectEncoding(buffer) {
144147
}
145148
}
146149

147-
return settings.value.defaultFileEncoding || "UTF-8";
150+
const def = settings.value.defaultFileEncoding;
151+
return def === "auto" ? "UTF-8" : def || "UTF-8";
148152
}
149153

150154
/**
@@ -165,6 +169,8 @@ export async function decode(buffer, charset) {
165169
charset = settings.value.defaultFileEncoding;
166170
}
167171

172+
if (charset === "auto") charset = "UTF-8";
173+
168174
charset = getEncoding(charset).name;
169175
const text = await execDecode(buffer, charset);
170176

@@ -186,6 +192,8 @@ export function encode(text, charset) {
186192
charset = settings.value.defaultFileEncoding;
187193
}
188194

195+
if (charset === "auto") charset = "UTF-8";
196+
189197
charset = getEncoding(charset).name;
190198
return execEncode(text, charset);
191199
}

0 commit comments

Comments
 (0)