Les EPW-filer som Latin-1, og bruk oppgitt kommune i klimaoppslaget
EPW-filer er ikke UTF-8. Stedsnavnet «Indre Østfold» kommer som Latin-1-byten 0xD8, og tolket som UTF-8 ble navnet ødelagt. Da fant ikke oppslaget klimakorrigerings- faktoren, og energiytelsen ble stående i lokalt klima uten korrigering til Oslo. Utslaget var 79 kWh/(m²·år) for Nordhusstykket 5, uten annet varsel enn en merknad inne i rapporten. Filen leses nå som Latin-1 når den ikke er gyldig UTF-8. Er kommunen oppgitt, gjelder den for oppslaget, slik at resultatet ikke avhenger av skrivemåten inne i klimafilen. Merknader fra beregningen skrives også ut på skjermen, ikke bare i rapporten. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015GeH3y8fwTaTudaD88P57o
This commit is contained in:
@@ -9,6 +9,19 @@ use crate::{Result, TIMER};
|
||||
use anyhow::{bail, Context};
|
||||
use std::path::Path;
|
||||
|
||||
/// Gjør bytene i en EPW-fil om til tekst.
|
||||
///
|
||||
/// EPW-filer er ikke UTF-8. Stedsnavn skrives i Latin-1, så «Indre Østfold» kommer som
|
||||
/// byten 0xD8 der Ø skal stå. Tolket som UTF-8 blir navnet ødelagt, og da slår ikke
|
||||
/// klimakorrigeringsfaktoren til, siden den slås opp på stedsnavnet. Filen leses derfor
|
||||
/// som UTF-8 når den er gyldig UTF-8, og ellers som Latin-1.
|
||||
pub fn avkod(bytes: &[u8]) -> String {
|
||||
match std::str::from_utf8(bytes) {
|
||||
Ok(s) => s.to_string(),
|
||||
Err(_) => bytes.iter().map(|b| *b as char).collect(),
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Vaerdata {
|
||||
pub sted: String,
|
||||
@@ -134,3 +147,22 @@ impl Vaerdata {
|
||||
.sum()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tester {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn latin1_stedsnavn_leses_riktig() {
|
||||
// «Indre Østfold» der Ø er Latin-1-byten 0xD8.
|
||||
let mut bytes = b"LOCATION,Indre ".to_vec();
|
||||
bytes.push(0xD8);
|
||||
bytes.extend_from_slice(b"stfold,None,NOR,CERRA,x,59.58,11.16,1, 130");
|
||||
assert_eq!(avkod(&bytes).split(',').nth(1), Some("Indre Østfold"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn gyldig_utf8_gaar_uendret_gjennom() {
|
||||
assert_eq!(avkod("Indre Østfold".as_bytes()), "Indre Østfold");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user