Skip to content

Instantly share code, notes, and snippets.

@Vulcanacht
Created November 28, 2015 01:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Vulcanacht/64bb6c9143cdcda6d477 to your computer and use it in GitHub Desktop.
Save Vulcanacht/64bb6c9143cdcda6d477 to your computer and use it in GitHub Desktop.
package com.jagex.runetek4.core.stringtools.general;
public class CP1252 {
public static final char[] CP1252_CHARS = {'\u20ac', '\0', '\u201a', '\u0192', '\u201e', '\u2026', '\u2020', '\u2021', '\u02c6', '\u2030', '\u0160', '\u2039', '\u0152', '\0', '\u017d', '\0', '\0', '\u2018', '\u2019', '\u201c', '\u201d', '\u2022', '\u2013', '\u2014', '\u02dc', '\u2122', '\u0161', '\u203a', '\u0153', '\0', '\u017e', '\u0178'};
public static String decode(final byte[] bytes, final int offset, final int length)
{
final char[] chars = new char[length];
int cOff = 0;
for (int i = 0; i < length; i++) {
int j = bytes[offset + i] & 0xff;
if (j != 0) {
if ((j >= 128) && (j < 160)) {
int ch = CP1252_CHARS[j - 128];
if (ch == 0) {
ch = 63;
}
j = ch;
}
chars[cOff++] = (char) j;
}
}
return new String(chars, 0, cOff);
}
public static byte encode(final char c)
{
byte encoded;
if (((c <= 0) || (c >= '\u0080')) && ((c < '\u00a0') || (c > '\u00ff'))) {
if (c == '\u20ac') { //Euro Sign
encoded = (byte) -128;
} else if (c == '\u201a') { //Low quotation
encoded = (byte) -126;
} else if (c == '\u0192') {
encoded = (byte) -125;
} else if (c == '\u201e') {
encoded = (byte) -124;
} else if (c == '\u2026') {
encoded = (byte) -123;
} else if (c == '\u2020') {
encoded = (byte) -122;
} else if (c == '\u2021') {
encoded = (byte) -121;
} else if (c == '\u02c6') {
encoded = (byte) -120;
} else if (c == '\u2030') {
encoded = (byte) -119;
} else if (c == '\u0160') {
encoded = (byte) -118;
} else if (c == '\u2039') {
encoded = (byte) -117;
} else if (c == '\u0152') {
encoded = (byte) -116;
} else if (c == '\u017d') {
encoded = (byte) -114;
} else if (c == '\u2018') {
encoded = (byte) -111;
} else if (c == '\u2019') {
encoded = (byte) -110;
} else if (c == '\u201c') {
encoded = (byte) -109;
} else if (c == '\u201d') {
encoded = (byte) -108;
} else if (c == '\u2022') {
encoded = (byte) -107;
} else if (c == '\u2013') {
encoded = (byte) -106;
} else if (c == '\u2014') {
encoded = (byte) -105;
} else if (c == '\u02dc') {
encoded = (byte) -104;
} else if (c == '\u2122') {
encoded = (byte) -103;
} else if (c == '\u0161') {
encoded = (byte) -102;
} else if (c == '\u203a') {
encoded = (byte) -101;
} else if (c == '\u0153') {
encoded = (byte) -100;
} else if (c == '\u017e') {
encoded = (byte) -98;
} else if (c == '\u0178') {
encoded = (byte) -97;
} else {
encoded = (byte) 63;
}
} else {
encoded = (byte) c;
}
return encoded;
}
public static byte[] encode(final CharSequence charsequence) {
final int length = charsequence.length();
final byte[] encoded = new byte[length];
for (int offset = 0; offset < length; offset++) {
final char c = charsequence.charAt(offset);
if (((c <= 0) || (c >= '\u0080')) && ((c < '\u00a0') || (c > '\u00ff'))) {
if (c == '\u20ac') {
encoded[offset] = (byte) -128;
} else if (c == '\u201a') {
encoded[offset] = (byte) -126;
} else if (c == '\u0192') {
encoded[offset] = (byte) -125;
} else if (c == '\u201e') {
encoded[offset] = (byte) -124;
} else if (c == '\u2026') {
encoded[offset] = (byte) -123;
} else if (c == '\u2020') {
encoded[offset] = (byte) -122;
} else if (c == '\u2021') {
encoded[offset] = (byte) -121;
} else if (c == '\u02c6') {
encoded[offset] = (byte) -120;
} else if (c == '\u2030') {
encoded[offset] = (byte) -119;
} else if (c == '\u0160') {
encoded[offset] = (byte) -118;
} else if (c == '\u2039') {
encoded[offset] = (byte) -117;
} else if (c == '\u0152') {
encoded[offset] = (byte) -116;
} else if (c == '\u017d') {
encoded[offset] = (byte) -114;
} else if (c == '\u2018') {
encoded[offset] = (byte) -111;
} else if (c == '\u2019') {
encoded[offset] = (byte) -110;
} else if (c == '\u201c') {
encoded[offset] = (byte) -109;
} else if (c == '\u201d') {
encoded[offset] = (byte) -108;
} else if (c == '\u2022') {
encoded[offset] = (byte) -107;
} else if (c == '\u2013') {
encoded[offset] = (byte) -106;
} else if (c == '\u2014') {
encoded[offset] = (byte) -105;
} else if (c == '\u02dc') {
encoded[offset] = (byte) -104;
} else if (c == '\u2122') {
encoded[offset] = (byte) -103;
} else if (c == '\u0161') {
encoded[offset] = (byte) -102;
} else if (c == '\u203a') {
encoded[offset] = (byte) -101;
} else if (c == '\u0153') {
encoded[offset] = (byte) -100;
} else if (c == '\u017e') {
encoded[offset] = (byte) -98;
} else if (c == '\u0178') {
encoded[offset] = (byte) -97;
} else {
encoded[offset] = (byte) 63;
}
} else {
encoded[offset] = (byte) c;
}
}
return encoded;
}
public static int encode(final CharSequence src, final int srcOffset, final int srcLength, final byte[] dest, final int destOffset) {
final int total = srcLength - srcOffset;
for (int i = 0; i < total; i++) {
final char c = src.charAt(i + srcOffset);
if (((c <= 0) || (c >= '\u0080')) && ((c < '\u00a0') || (c > '\u00ff'))) {
if (c == '\u20ac') {
dest[i + destOffset] = (byte) -128;
} else if (c == '\u201a') {
dest[destOffset + i] = (byte) -126;
} else if (c == '\u0192') {
dest[i + destOffset] = (byte) -125;
} else if (c == '\u201e') {
dest[i + destOffset] = (byte) -124;
} else if (c == '\u2026') {
dest[destOffset + i] = (byte) -123;
} else if (c == '\u2020') {
dest[destOffset + i] = (byte) -122;
} else if (c == '\u2021') {
dest[i + destOffset] = (byte) -121;
} else if (c == '\u02c6') {
dest[i + destOffset] = (byte) -120;
} else if (c == '\u2030') {
dest[i + destOffset] = (byte) -119;
} else if (c == '\u0160') {
dest[i + destOffset] = (byte) -118;
} else if (c == '\u2039') {
dest[i + destOffset] = (byte) -117;
} else if (c == '\u0152') {
dest[destOffset + i] = (byte) -116;
} else if (c == '\u017d') {
dest[i + destOffset] = (byte) -114;
} else if (c == '\u2018') {
dest[destOffset + i] = (byte) -111;
} else if (c == '\u2019') {
dest[i + destOffset] = (byte) -110;
} else if (c == '\u201c') {
dest[i + destOffset] = (byte) -109;
} else if (c == '\u201d') {
dest[destOffset + i] = (byte) -108;
} else if (c == '\u2022') {
dest[destOffset + i] = (byte) -107;
} else if (c == '\u2013') {
dest[i + destOffset] = (byte) -106;
} else if (c == '\u2014') {
dest[i + destOffset] = (byte) -105;
} else if (c == '\u02dc') {
dest[destOffset + i] = (byte) -104;
} else if (c == '\u2122') {
dest[destOffset + i] = (byte) -103;
} else if (c == '\u0161') {
dest[destOffset + i] = (byte) -102;
} else if (c == '\u203a') {
dest[i + destOffset] = (byte) -101;
} else if (c == '\u0153') {
dest[destOffset + i] = (byte) -100;
} else if (c == '\u017e') {
dest[i + destOffset] = (byte) -98;
} else if (c == '\u0178') {
dest[destOffset + i] = (byte) -97;
} else {
dest[i + destOffset] = (byte) 63;
}
} else {
dest[i + destOffset] = (byte) c;
}
}
return total;
}
public static String url_encode(final String str) {
final int length = str.length();
final StringBuilder output = new StringBuilder(length);
for (int index = 0; index < length; index++) {
final char c = str.charAt(index);
if (((c < 'a') || (c > 'z')) && ((c < 'A') || (c > 'Z')) && ((c < '0') || (c > '9')) && (c != '.') && (c != '-') && (c != '*') && (c != '_')) {
if (c == ' ') {
output.append('+');
} else {
final int encoded = encode(c);
output.append('%');
int o = (encoded >> 4) & 0xf;
if (o >= 10) {
output.append((char) (55 + o));
} else {
output.append((char) (o + 48));
}
o = encoded & 0xf;
if (o >= 10) {
output.append((char) (o + 55));
} else {
output.append((char) (o + 48));
}
}
} else {
output.append(c);
}
}
return output.toString();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment