summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaru <haru@dotalux.com>2014-04-02 21:01:44 +0200
committerHaru <haru@dotalux.com>2014-04-02 21:07:14 +0200
commit694d32a550e8841a6ed6c237880e3d5005e6208d (patch)
tree3e76339b65990210e28286c23c4bed08956f3082
parent34658a75ffeced4d9ed75a6e0b4ae015c1b7c6de (diff)
downloadhercules-694d32a550e8841a6ed6c237880e3d5005e6208d.tar.gz
hercules-694d32a550e8841a6ed6c237880e3d5005e6208d.tar.bz2
hercules-694d32a550e8841a6ed6c237880e3d5005e6208d.tar.xz
hercules-694d32a550e8841a6ed6c237880e3d5005e6208d.zip
Added UTF-8 BOM detection
- This prevents things like the following from happening, by warning the user if an incompatible file is loaded: http://hercules.ws/board/topic/5126-mapname-selft-announcer/?p=33068 - We're erroring out instead of ignoring it, as explained in the source comment. - Special thanks to jaBote. Signed-off-by: Haru <haru@dotalux.com>
-rw-r--r--src/map/npc.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/map/npc.c b/src/map/npc.c
index f77359b5f..3018cceeb 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -3951,6 +3951,18 @@ int npc_parsesrcfile(const char* filepath, bool runOnInit) {
}
fclose(fp);
+ if ((unsigned char)buffer[0] == 0xEF && (unsigned char)buffer[1] == 0xBB && (unsigned char)buffer[2] == 0xBF) {
+ // UTF-8 BOM. This is most likely an error on the user's part, because:
+ // - BOM is discouraged in UTF-8, and the only place where you see it is Notepad and such.
+ // - It's unlikely that the user wants to use UTF-8 data here, since we don't really support it, nor does the client by default.
+ // - If the user really wants to use UTF-8 (instead of latin1, EUC-KR, SJIS, etc), then they can still do it <without BOM>.
+ // More info at http://unicode.org/faq/utf_bom.html#bom5 and http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8
+ ShowError("npc_parsesrcfile: Detected unsupported UTF-8 BOM in file '%s'. Stopping (please consider using another character set.)\n", filepath);
+ aFree(buffer);
+ fclose(fp);
+ return -1;
+ }
+
// parse buffer
for( p = script->skip_space(buffer); p && *p ; p = script->skip_space(p) )
{