Most people would just go by if they saw a ton of space with a single repeating byte/pattern. No way to guarantee, though.
Also, it is typically only useful if the free space is in the same ROM bank as the code/data one wants to change.
As to dakuten code, it would typically be something like this:
(say if dakuten were $A0 to $E0)
lda ($20),y ;say the text pointer was stored at $20-21
bcc NotDakuten ;less than
;do stuff here with dakuten/handakuten
Other games I've seen do something like this:
-store the hex value for a space tile to RAM
-read a text character, store to RAM
-if han/dakuten, store that han/dakuten mark over the space tile in RAM
And then when it goes to print the character, it will read and print both the character and the mark tile (blank or han/dakuten).
For English, you'd have to null out the dakuten-writing code. (say it stored the base character to $0600 and the dakuten to $0601, you'd null the line of the code that's like "lda $0601: sta $2007"
Other games might do a variation, where it writes up a string that gets copied to VRAM.
One such format I've seen:
1 byte length, 0 for endSo for example, it might be 01 20 82 50 01 20 62 3D 00, if 50 were the base character and 3D were the dakuten tile. If it were doing that, you'd take out the routine that was writing 01 20 62 3D to the buffer.
2 byte VRAM address
repeat (until length=0)