You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by da...@apache.org on 2012/02/19 11:39:04 UTC
svn commit: r1290986 -
/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoGpsText.java
Author: damjan
Date: Sun Feb 19 10:39:03 2012
New Revision: 1290986
URL: http://svn.apache.org/viewvc?rev=1290986&view=rev
Log:
The Unicode encoding for GPS text written by Exiftool,
is UCS-2 in either little-endian or big-endian, depending on
the file's encoding. Do the same, since it can't read our UTF-8,
which was guessed anyway.
Jira issue key: SANSELAN-51
Modified:
commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoGpsText.java
Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoGpsText.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoGpsText.java?rev=1290986&r1=1290985&r2=1290986&view=diff
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoGpsText.java (original)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoGpsText.java Sun Feb 19 10:39:03 2012
@@ -20,6 +20,7 @@ import java.io.UnsupportedEncodingExcept
import org.apache.commons.sanselan.ImageReadException;
import org.apache.commons.sanselan.ImageWriteException;
+import org.apache.commons.sanselan.common.BinaryConstants;
import org.apache.commons.sanselan.common.BinaryFileFunctions;
import org.apache.commons.sanselan.formats.tiff.TiffField;
import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
@@ -42,33 +43,44 @@ public final class TagInfoGpsText extend
private static final class TextEncoding
{
public final byte prefix[];
- public final String encodingName;
+ public final String encodingNameLE;
+ public final String encodingNameBE;
- public TextEncoding(final byte[] prefix, final String encodingName)
+ public TextEncoding(final byte[] prefix, final String encodingNameLE,
+ final String encodingNameBE)
{
this.prefix = prefix;
- this.encodingName = encodingName;
+ this.encodingNameLE = encodingNameLE;
+ this.encodingNameBE = encodingNameBE;
+ }
+
+ public String getEncodingName(int byteOrder) {
+ if (byteOrder == BinaryConstants.BYTE_ORDER_BIG_ENDIAN) {
+ return encodingNameBE;
+ } else {
+ return encodingNameLE;
+ }
}
}
private static final TagInfoGpsText.TextEncoding TEXT_ENCODING_ASCII = new TextEncoding(
new byte[]{
0x41, 0x53, 0x43, 0x49, 0x49, 0x00, 0x00, 0x00,
- }, "US-ASCII"); // ITU-T T.50 IA5
+ }, "US-ASCII", "US-ASCII"); // ITU-T T.50 IA5
private static final TagInfoGpsText.TextEncoding TEXT_ENCODING_JIS = new TextEncoding(
new byte[]{
0x4A, 0x49, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00,
- }, "JIS"); // JIS X208-1990
+ }, "JIS", "JIS"); // JIS X208-1990
private static final TagInfoGpsText.TextEncoding TEXT_ENCODING_UNICODE = new TextEncoding(
new byte[]{
0x55, 0x4E, 0x49, 0x43, 0x4F, 0x44, 0x45, 0x00,
// Which Unicode encoding to use, UTF-8?
- }, "UTF-8"); // Unicode Standard
+ }, "UTF-16LE", "UTF-16BE"); // Unicode Standard
private static final TagInfoGpsText.TextEncoding TEXT_ENCODING_UNDEFINED = new TextEncoding(
new byte[]{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// Try to interpret an undefined text as ISO-8859-1 (Latin)
- }, "ISO-8859-1"); // Undefined
+ }, "ISO-8859-1", "ISO-8859-1"); // Undefined
private static final TagInfoGpsText.TextEncoding TEXT_ENCODINGS[] = {
TEXT_ENCODING_ASCII, //
TEXT_ENCODING_JIS, //
@@ -89,9 +101,9 @@ public final class TagInfoGpsText extend
{
// try ASCII, with NO prefix.
byte asciiBytes[] = s
- .getBytes(TEXT_ENCODING_ASCII.encodingName);
+ .getBytes(TEXT_ENCODING_ASCII.getEncodingName(byteOrder));
String decodedAscii = new String(asciiBytes,
- TEXT_ENCODING_ASCII.encodingName);
+ TEXT_ENCODING_ASCII.getEncodingName(byteOrder));
if (decodedAscii.equals(s))
{
// no unicode/non-ascii values.
@@ -108,7 +120,7 @@ public final class TagInfoGpsText extend
{
// use unicode
byte unicodeBytes[] = s
- .getBytes(TEXT_ENCODING_UNICODE.encodingName);
+ .getBytes(TEXT_ENCODING_UNICODE.getEncodingName(byteOrder));
byte result[] = new byte[unicodeBytes.length
+ TEXT_ENCODING_UNICODE.prefix.length];
System.arraycopy(TEXT_ENCODING_UNICODE.prefix, 0, result,
@@ -179,7 +191,7 @@ public final class TagInfoGpsText extend
{
return new String(bytes, encoding.prefix.length,
bytes.length - encoding.prefix.length,
- encoding.encodingName);
+ encoding.getEncodingName(entry.byteOrder));
}
catch (UnsupportedEncodingException e)
{