Various unicode fixes made.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@13371 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
CaS 2002-04-06 06:33:34 +00:00
parent e32b1545f3
commit 5053fda75a
4 changed files with 102 additions and 58 deletions

View file

@ -1,3 +1,9 @@
2002-04-06 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSString.m: Fix error in unicode BOM handling
* Source/GSString.m: Fix error in length of unicode data produced.
* Tools/cvtenc.m: Made easy to use and added instructions.
Sat Apr 6 02:42:43 2002 Nicola Pero <n.pero@mi.flashnet.it> Sat Apr 6 02:42:43 2002 Nicola Pero <n.pero@mi.flashnet.it>
* Source/NSUser.m (NSSearchPathForDirectoriesInDomains): Fixed * Source/NSUser.m (NSSearchPathForDirectoriesInDomains): Fixed

View file

@ -813,7 +813,7 @@ dataUsingEncoding_c(ivars self, NSStringEncoding encoding, BOOL flag)
{ {
return nil; return nil;
} }
return [NSDataClass dataWithBytesNoCopy: r length: l]; return [NSDataClass dataWithBytesNoCopy: r length: l * sizeof(unichar)];
} }
else else
{ {

View file

@ -1166,12 +1166,12 @@ handle_printf_atsign (FILE *stream,
b = (unsigned char*)[data bytes]; b = (unsigned char*)[data bytes];
uptr = (unichar*)b; uptr = (unichar*)b;
if (*uptr == 0xFFFE) if (*uptr == byteOrderMark)
{ {
b = (unsigned char*)++uptr; b = (unsigned char*)++uptr;
len -= sizeof(unichar); len -= sizeof(unichar);
} }
else if (*uptr == 0xFEFF) else if (*uptr == byteOrderMarkSwapped)
{ {
b = (unsigned char*)++uptr; b = (unsigned char*)++uptr;
len -= sizeof(unichar); len -= sizeof(unichar);
@ -2376,7 +2376,7 @@ handle_printf_atsign (FILE *stream,
buff = (unichar*)NSZoneMalloc(NSDefaultMallocZone(), buff = (unichar*)NSZoneMalloc(NSDefaultMallocZone(),
sizeof(unichar)*(len+1)); sizeof(unichar)*(len+1));
buff[0] = 0xFEFF; buff[0] = byteOrderMark;
[self getCharacters: &buff[1]]; [self getCharacters: &buff[1]];
return [NSDataClass dataWithBytesNoCopy: buff return [NSDataClass dataWithBytesNoCopy: buff
length: sizeof(unichar)*(len+1)]; length: sizeof(unichar)*(len+1)];

View file

@ -38,6 +38,9 @@ main(int argc, char** argv, char **env)
NSProcessInfo *proc; NSProcessInfo *proc;
NSArray *args; NSArray *args;
unsigned i; unsigned i;
BOOL found = NO;
NSString *n;
NSStringEncoding enc = 0;
#ifdef GS_PASS_ARGUMENTS #ifdef GS_PASS_ARGUMENTS
[NSProcessInfo initializeWithArguments: argv count: argc environment: env]; [NSProcessInfo initializeWithArguments: argv count: argc environment: env];
@ -53,15 +56,6 @@ main(int argc, char** argv, char **env)
args = [proc arguments]; args = [proc arguments];
if ([args count] <= 1)
{
NSLog(@"No file names given to convert.");
}
else
{
NSString *n;
NSStringEncoding enc = 0;
n = [[NSUserDefaults standardUserDefaults] stringForKey: @"Encoding"]; n = [[NSUserDefaults standardUserDefaults] stringForKey: @"Encoding"];
if (n == nil) if (n == nil)
{ {
@ -95,7 +89,7 @@ main(int argc, char** argv, char **env)
} }
} }
for (i = 1; i < [args count]; i++) for (i = 1; found == NO && i < [args count]; i++)
{ {
NSString *file = [args objectAtIndex: i]; NSString *file = [args objectAtIndex: i];
@ -104,17 +98,51 @@ main(int argc, char** argv, char **env)
i++; i++;
continue; continue;
} }
found = YES;
NS_DURING NS_DURING
{ {
NSData *myData; NSData *myData;
NSString *myString;
myString = [NSString stringWithContentsOfFile: file]; myData = [[NSData alloc] initWithContentsOfFile: file];
myData = [myString dataUsingEncoding: enc
allowLossyConversion: NO];
if (myData == nil) if (myData == nil)
{ {
NSLog(@"Encoding conversion failed.", file); NSLog(@"File read operation failed for %@.", file);
}
else
{
unsigned l = [myData length];
const unichar *b = (const unichar*)[myData bytes];
NSStringEncoding iEnc;
NSStringEncoding oEnc;
NSString *myString;
if (l > 1 && (*b == 0xFFFE || *b == 0xFEFF))
{
iEnc = NSUnicodeStringEncoding;
oEnc = enc;
}
else
{
iEnc = enc;
oEnc = NSUnicodeStringEncoding;
}
myString = [[NSString alloc] initWithData: myData
encoding: iEnc];
RELEASE(myData);
if (myString == nil)
{
NSLog(@"Encoding input conversion failed for %@.", file);
}
else
{
myData = [myString dataUsingEncoding: oEnc
allowLossyConversion: NO];
RELEASE(myString);
if (myData == nil)
{
NSLog(@"Encoding output conversion failed for %@.",
file);
} }
else else
{ {
@ -125,12 +153,22 @@ main(int argc, char** argv, char **env)
[out synchronizeFile]; [out synchronizeFile];
} }
} }
}
}
NS_HANDLER NS_HANDLER
{ {
NSLog(@"Converting '%@' - %@", file, [localException reason]); NSLog(@"Converting '%@' - %@", file, [localException reason]);
} }
NS_ENDHANDLER NS_ENDHANDLER
} }
if (found == NO)
{
NSLog(@"\nThis utility expects a filename as an argument.\n"
@"It reads the file, and writes it to STDOUT after converting it\n"
@"to unicode from C string encoding or vice versa.\n"
@"You can supply a '-Encoding name' option to specify the C string\n"
@"encoding to be used, if you don't want to use the default.");
} }
[pool release]; [pool release];
return 0; return 0;