Utvecklingstips

Encoding av Unicode till iso-8859-1 i C#

När man överför data mellan olika system hamnar man ibland i helvetet med gamla encodings. I .NET är alla strängar kodade i Unicode och så länge man ser till att underliggande system klarar av detta (rekommenderas!) behöver man inte tänka mer på det.

När man hamnar i situationen att man ändå behöver skicka något till en annan sajt som inte använder Unicode så brukar det i Sverige och Europa handla om Windows standardencoding, som här är iso-8859-1. Det finns som tur är bra verktyg i .NET som hjälper till men jag har suttit många timmar tidigare och ändå inte lyckats förstå hur det hela hänger ihop och måste erkänna att jag tidigare har gjort manuell replace mellan å och %e5 osv.

Jag tog mig nu tiden att reda ut vad det är som är anledningen till att det blir fel och kom fram till att jag i min iver att koda om strängarna hela tiden råkade ändå konvertera tillbaka dem till Unicode för som sagt, .NET kan bara koda interna strängar i Unicode och vill man hantera en annan encoding måste man använda en byte[] array under tiden man hanterar sin sträng. Och ska man koda om den till en URL så kan man inte gå via sträng utan måste bibehålla byte[] arrayen och använda de inbyggda funktionerna i .NET som kodar dessa arrayer till URL och först därefter begära att konvertera resultatet till en sträng.

För att ni ska slippa detta tråkiga arbete bjuder jag därför på en liten Extension Method.

Håll till godo:

/// <summary>
/// Encodes a unicode formatted string into a iso-8859-1 latin 1 string encoded with urlencode. For example: rånövägen -> r%E5n%F6v%E4gen
/// </summary>
/// <param name="unicode"></param>
/// <returns></returns>
public static string UrlEncodeLatinString(this string unicode)
{	
	var encoding = Encoding.GetEncoding("iso-8859-1");
	bytes = Encoding.Convert(Encoding.Default, encoding,Encoding.Default.GetBytes(unicode));
	Encoding.Default.GetString(HttpUtility.UrlEncodeToBytes(bytes));
}
Andra bloggar om: 
 
Christian Landgren

2012-04-10 kl. 10:20

Web Analytics