diff -ur src.org/crt.c src/crt.c
--- src.org/crt.c 2006-12-06 10:48:21.000000000 +0900
+++ src/crt.c 2006-12-06 15:36:01.000000000 +0900
@@ -259,7 +259,7 @@
int length;
int cn;
- char kc_char[]={'E','J','S'};
+ char kc_char[]={'E','J','S','U'};
char rm_char[]={'L','+','C'};
diff -ur src.org/ed.h src/ed.h
--- src.org/ed.h 2006-12-06 10:48:21.000000000 +0900
+++ src/ed.h 2006-12-06 15:36:01.000000000 +0900
@@ -165,6 +165,8 @@
char systemline[MAXEDITLINE+1];
dspreg_t *sl_drp;
char doublekey[4+1];
+
+ bool f_force_utf8;
} sysinfo_t;
VAL sysinfo_t sysinfo;
@@ -315,7 +317,7 @@
extern int file_knjchk(FILE *fp);
extern int file_gets(char *s, size_t bytes, FILE *fp, int *n_cr, int *n_lf);
extern void kanji_toeuc(char *s,size_t bytes, const char *t
- , bool f_sjis, int *jm);
+ , int kcode, int *jm);
#define JM_ank 0
#define JM_kana 1
@@ -325,6 +327,7 @@
#define KC_euc 0
#define KC_jis 1
#define KC_sjis 2
+#define KC_utf8 3
#define RM_lf 0
#define RM_crlf 1
diff -ur src.org/file.c src/file.c
--- src.org/file.c 2006-12-06 10:48:21.000000000 +0900
+++ src/file.c 2006-12-12 09:49:49.000000000 +0900
@@ -413,7 +413,7 @@
bool f;
f=file_gets(buf, MAXEDITLINE, kip->fp, &kip->n_cr, &kip->n_lf);
- kanji_toeuc(s, MAXEDITLINE, buf, kip->kc==KC_sjis, &kip->jm);
+ kanji_toeuc(s, MAXEDITLINE, buf, kip->kc, &kip->jm);
//fprintf(stderr,"[%s]%d\n",s,f);
return f!=-1?kip:NULL;
}
@@ -445,6 +445,8 @@
{
lists_add(file_new_proc,"");
edbuf[CurrentFileNo].ct = -1;
+ if (sysinfo.f_force_utf8)
+ edbuf[CurrentFileNo].kc = KC_utf8;
sprintf(buf, "%s [ %s ]", NEWFILE_MSG, filename);
system_msg(buf);
diff -ur src.org/iskanji.c src/iskanji.c
--- src.org/iskanji.c 2006-12-06 10:48:21.000000000 +0900
+++ src/iskanji.c 2006-12-06 15:36:01.000000000 +0900
@@ -9,6 +9,7 @@
All rights reserved.
--------------------------------------------------------------------*/
#include "ed.h"
+#include <iconv.h>
bool iscnt(unsigned char c)
@@ -251,12 +252,27 @@
const char *p;
enum {KM_ank, KM_kanji, KM_kana} km;
+ static bool iconv_initialized=FALSE;
+ static iconv_t iconv_euc2utf8;
+ char *ss;
+
+ if (!iconv_initialized)
+ {
+ iconv_euc2utf8=iconv_open("UTF-8","EUC-JP");
+ iconv_initialized=TRUE;
+ }
+
p=s;
switch(kc)
{
case KC_euc:
return t;
+ case KC_utf8:
+ ss=s;
+ ss[iconv(iconv_euc2utf8,&t,&bytes,&s,&bytes)]='\0';
+ break;
+
case KC_sjis:
for(;*t!='\0'&& bytes>0;)
{
@@ -346,6 +362,9 @@
f_sjis=FALSE;
f_euc=FALSE;
+ if (sysinfo.f_force_utf8)
+ return KC_utf8;
+
for(;;)
{
c=fgetc(fp);
@@ -428,7 +447,7 @@
}
-void kanji_toeuc(char *s,size_t bytes,const char *t,bool f_sjis,int *jm)
+void kanji_toeuc_org(char *s,size_t bytes,const char *t,bool f_sjis,int *jm)
{
u_char c,sjc;
bool sf; // (SI/SO)shift flag
@@ -551,6 +570,27 @@
*s='\0';
}
+void kanji_toeuc(char *s,size_t bytes,const char *t,int kcode,int *jm)
+{
+ static bool iconv_initialized=FALSE;
+ static iconv_t iconv_utf82euc;
+ char *ss;
+
+ if (!iconv_initialized)
+ {
+ iconv_utf82euc=iconv_open("EUC-JP","UTF-8");
+ iconv_initialized=TRUE;
+ }
+
+ if (kcode==KC_utf8)
+ {
+ ss=s;
+ ss[iconv(iconv_utf82euc,&t,&bytes,&s,&bytes)] ='\0';
+ } else
+ {
+ kanji_toeuc_org(s,bytes,t,kcode==KC_sjis,jm);
+ }
+}
int kanji_poscanon(int offset, const char *buf)
{
diff -ur src.org/ne.c src/ne.c
--- src.org/ne.c 2006-12-06 10:48:21.000000000 +0900
+++ src/ne.c 2006-12-06 15:36:01.000000000 +0900
@@ -157,7 +157,7 @@
for (optcount=1; optcount<argc; ++optcount) // ????
{
- c=getopt(argc, argv, "Vrjeod:D:");
+ c=getopt(argc, argv, "Vrjeod:D:u");
if (c==EOF)
break;
@@ -185,6 +185,9 @@
sp=buf;
p=strsep(&sp,"=");
hash_set(sysinfo.vp_def, buf, p);
+ case 'u':
+ sysinfo.f_force_utf8=TRUE;
+ break;
}
}