I would say that this is an implementation detail for what is concerning the real structure of the storage on disk.
In practice you are given a certain amount of space per origin (usually 5MiB, to check the actual storage you can use this test tool linked in the MDN documentations) and you can store data (both in terms of keys and values) as long as you don't exceed that size, as shown in a previous answer. So yes the keys are included in the storage quota.
As it points out in the test tool I included, chars are actually UTF-16 so they takes up 2 bytes of your storage quota.
Also note that the storage stores strings, this means that if you put a large float as key or value you are not storing it in its binary format but as strings!
// These takes up the same space
localStorage.setItem("a", 123);
localStorage.setItem("a", "123");
In fact if you try to do typeof of the following you get string
in both cases
localStorage.setItem("123", "");
localStorage.setItem(123, "");
typeof localStorage.key(0); // returns "string"
typeof localStorage.key(1); // returns "string" as well
As for the second part, in terms of storage this
localStorage.setItem("k","");
localStorage.setItem("o","");
localStorage.setItem("h","");
should take 3 chars of storage from your quota, that is 3 * 2 bytes if using UTF-16 or 3 bytes if using UTF-8.
For an overview of local storage solutions you can check here http://www.html5rocks.com/en/features/storage